让某个软件无法被操作员最小化(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/