让某个软件无法被操作员最小化(C#演示)

有一次在生产线上, 有一个显示激光轮廓的软件被操作员最小化了, 结果悲剧了, 轮廓图像都抓不到了.

原先的设想的操作流程是这个软件是不能被操作员最小化的, 但可惜不能指望员工这么能守规矩. 看来只能在技术上做一些限制, 防止员工手贱. 

 

这个需求并不是通过把软件的最小化按钮取消这么简单来实现, 因为这个软件是别人开发的, 不是我能修改的.

 

也不能通过什么"神奇的抓屏幕代码"来实现这个需求, 据笔者所知, 最小化的程序, 它的界面会停止更新, 因此也就无法截取它的界面图像. (但是你注意到win7任务栏上的程序状态预览缩略图吗, 貌似它可以做到实时显示最小化后程序的当前UI状态, 但是笔者不知道如何实现这个功能. 如果你知道, 谢谢回复本贴教下笔者!), 网上目前还没有看到有人能实现所谓后台截图, 即截取最小化程序的界面图像.

 

笔者找到的方案是: 软件检测程序窗体的状态, 如果处于隐藏或者最小化的状态, 则恢复到活动状态.

 

下面给出实现代码.

这个程序是在xp下实现的, 你要注意一下你自己的windows版本自带的计算器程序的标题栏名字, 是不是叫"计算器". 程序是按这个名字找窗体的.

运行效果是: 如果计算被最小化了, 那么点击程序上的那个按钮, 计算器就会恢复到原来的正常显示状态.

 

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Windows.Forms;
 9 using System.Runtime.InteropServices;
10 using System.Diagnostics;
11 
12 namespace WindowsFormsApplication2
13 {
14     public partial class Form1 : Form
15     {
16    
17         [DllImport("User32.dll ", EntryPoint = "FindWindow")]
18         private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
19         [DllImport("user32.dll")]
20         private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
21         [DllImport("user32.dll", SetLastError = true)]
22         internal static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);
23 
24 
25         private const int SW_SHOWNORMAL = 1;
26         private const int SW_RESTORE = 9;
27         private const int SW_SHOWNOACTIVATE = 4; 
28 
29 
30         internal struct WINDOWPLACEMENT
31         {
32             public int length;
33             public int flags;
34             public ShowWindowCommands showCmd;
35             public System.Drawing.Point ptMinPosition;
36             public System.Drawing.Point ptMaxPosition;
37             public System.Drawing.Rectangle rcNormalPosition;
38         }
39 
40         internal enum ShowWindowCommands : int
41         {
42             Hide = 0,
43             Normal = 1,
44             Minimized = 2,
45             Maximized = 3,
46         }
47 
48         private static WINDOWPLACEMENT GetPlacement(IntPtr hwnd)
49         {
50             WINDOWPLACEMENT placement = new WINDOWPLACEMENT();
51             placement.length = Marshal.SizeOf(placement);
52             GetWindowPlacement(hwnd, ref placement);
53             return placement;
54         }
55 
56         private void MiniMizeAppication(string processName)
57         {
58             Process processs = Process.GetProcesses().Where(s => s.MainWindowTitle == processName).SingleOrDefault();
59             if (processs != null)
60             {
61                 IntPtr handle = FindWindow(null, processs.MainWindowTitle);
62                 var status = GetPlacement(handle).showCmd;
63                 if (status == ShowWindowCommands.Minimized ||
64                     status == ShowWindowCommands.Hide)
65                     ShowWindow(handle, SW_SHOWNOACTIVATE);
66             }
67         }
68 
69         public Form1()
70         {
71             InitializeComponent();
72         }
73 
74         private void button1_Click(object sender, EventArgs e)
75         {
76             MiniMizeAppication("计算器");
77         }
78 
79     }
80 
81 }

 

 

 

本文源代码下载

原创文章,出处 : http://www.cnblogs.com/hackpig/

 

posted @ 2016-08-22 08:42  猪悟能  阅读(1473)  评论(0编辑  收藏  举报