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

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

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

也不能通过什么"神奇的抓屏幕代码"来实现这个需求, 据笔者所知, 最小化的程序, 它的界面会停止更新, 因此也就无法截取它的界面图像. (但是你注意到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("计算器");
} } }

本文源代码下载

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

让某个软件无法被操作员最小化(C#演示)的更多相关文章

  1. WPF程序最小化到任务通知栏

    我们通常使用的桌面软件,都可以最小化到任务通知栏,并且可以从任务通知栏再打开当前软件,或者通过软件的快捷方式从任务通知栏呼出. 我们可以通过下面的方式把WPF程序最小化到任务栏.由于WPF并没有实现N ...

  2. 实用ExtJS教程100例-007:ExtJS中Window组件最小化

    在上一节中我们演示了如何使用ExtJS的Window组件,这篇内容中我们来演示一下如何将窗口最小化. 要让ExtJS标题栏中显示最小化按钮并不麻烦,只需要设置 minimizable: true 即可 ...

  3. AOPR软件最小化消失了

    结合日常使用软件的经历,我们都是选择最小化按钮后,点击状态栏中最小化图标即可恢复软件窗口.在使用Advanced Office Password Recovery的过程中,有时会出现点击最小化按钮后在 ...

  4. VC++ 实现VC程序启动时最小化到任务栏(完美解决闪烁问题)

    之前写的一个VC应用程序,是程序启动时就直接出现在任务栏, 窗体不出现,等用户点击任务栏图标再出现窗口.和一些防火墙什么的软件类似. 这种效果实现并不是很困难的,硬是找不到最好的.为什么呢? 首先,在 ...

  5. 生产服务器环境最小化安装后 Centos 6.5优化配置[转]

    内容目录 centos6.5最小化安装后配置网络: IP地址, 网关, 主机名, DNS 更新系统源并且升级系统 系统时间更新和设定定时任 创建普通用户并进行sudo授权管理 修改SSH端口号和屏蔽r ...

  6. RHEL/CentOS 7最小化安装后需做的30件事情

    导读 CentOS是一个工业标准的Linux发行版,是红帽企业版 Linux 的衍生版本.你安装完后马上就可以使用,但是为了更好地使用你的系统,你需要进行一些升级.安装新的软件包.配置特定服务和应用程 ...

  7. Debian 8 最小化系统安装muduo

    最近开始学习陈硕的muduo C++ Linux多线程网络库,首先当然是要安装.其间遇到过不少问题,最后不能说都解决了,只能说找到了一条不会遇到什么问题的路线.总结起来是两点: 注意各软件之间要版本匹 ...

  8. 关闭Outlook时最小化 dll

    用Outlook时最让我感觉不爽的就是不小心点了关闭按钮就会把Outlook关闭. 我们用软件的时候都希望软件有一个关闭时最小化功能,更希望Outlook也有这个功能 但让我很失望的是把设置里看了一个 ...

  9. 《Effective Java》笔记 使类和成员的可访问性最小化

    类和接口 第13条 使类和成员的可访问性最小化 1.设计良好的模块会隐藏所有的实现细节,把它的API与实现清晰的隔离开来,模块之间只通过它们的API进行通信,一个模块不需要知道其他模块的内部工作情况: ...

随机推荐

  1. Linux可视化服务器管理工具webmin

    webmin是一个可视化的linux服务器管理工具,可以帮助我们实现很多功能. Webmin官网: http://www.webmin.com/ 下载地址:http://prdownloads.sou ...

  2. (https://www.ibm.com/developerworks/community/forums/html/topic?id=77777777-0000-0000-0000-000014550004)Topic: Caught java.io.CharConversionException. ERRORCODE=-4220, SQLSTATE=null

    270002WDPN                                            3 Posts                             0 people l ...

  3. C# 线程池执行操作例子

    public partial class Form1 : Form { CountdownEvent hander = ); public static object lock_action = ne ...

  4. C# asp.net中导出Excel表时总出现"只能在执行 Render() 的过程中调用 RegisterForEventValidation

    C# asp.net中导出Excel表时总出现"只能在执行 Render() 的过程中调用 RegisterForEventValidation 后台添加以下方法:/// <summa ...

  5. 点击除元素以外的任意地方隐藏元素js

    比如想实现点击列表弹出筛选器,点击其他任意地方关闭筛选器,如图 该筛选器class名 $(document).click(function () { $(".subMenu").h ...

  6. 8 云计算系列之Horizon的安装与虚拟机创建流程

    preface 在上一章节中,我们可以在无web管理界面上创建并启动虚拟机,虽然可以这么做,但是敲命令太繁琐,所以此时我们可以安装openstack web管理界面,通过web界面的图形化操作open ...

  7. 安装office2010出现了错误,提示要安装MSXML6.10.1129.0解决方法

    将下面的内容复制到记事本中,然后将记事本存成.reg文件 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\TypeLib\{F5078F1 ...

  8. PHP易混淆函数的区别及用法汇总

    本文实例分析了PHP易混淆函数的区别及用法.分享给大家供大家参考.具体分析如下: 1.echo和print的区别PHP中echo和print的功能基本相同(输出),但是两者之间还是有细微差别的.ech ...

  9. 泛泰A870K去掉相机快门声音的方法

    首先ROOT手机,挂载读写,/system/media/audio/ui里面哈,把camera-click.ogg改成camera-click.ogg.bak就可以了 转载自:http://bbs.9 ...

  10. AngularJS------命令行

    如下:(‘$’符号不需要输入哦) $ ng build --发布项目