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

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

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

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

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

下面给出实现代码.

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

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

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics; namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{ [DllImport("User32.dll ", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll", SetLastError = true)]
internal static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl); private const int SW_SHOWNORMAL = ;
private const int SW_RESTORE = ;
private const int SW_SHOWNOACTIVATE = ; internal struct WINDOWPLACEMENT
{
public int length;
public int flags;
public ShowWindowCommands showCmd;
public System.Drawing.Point ptMinPosition;
public System.Drawing.Point ptMaxPosition;
public System.Drawing.Rectangle rcNormalPosition;
} internal enum ShowWindowCommands : int
{
Hide = ,
Normal = ,
Minimized = ,
Maximized = ,
} private static WINDOWPLACEMENT GetPlacement(IntPtr hwnd)
{
WINDOWPLACEMENT placement = new WINDOWPLACEMENT();
placement.length = Marshal.SizeOf(placement);
GetWindowPlacement(hwnd, ref placement);
return placement;
} private void MiniMizeAppication(string processName)
{
Process processs = Process.GetProcesses().Where(s => s.MainWindowTitle == processName).SingleOrDefault();
if (processs != null)
{
IntPtr handle = FindWindow(null, processs.MainWindowTitle);
var status = GetPlacement(handle).showCmd;
if (status == ShowWindowCommands.Minimized ||
status == ShowWindowCommands.Hide)
ShowWindow(handle, SW_SHOWNOACTIVATE);
}
} public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
MiniMizeAppication("计算器");
} } }

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

本文源代码下载

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

05-11 17:13