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

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

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

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

    where 子句用于指定类型约束,这些约束可以作为泛型声明中定义的类型参数的变量.1.接口约束.例如,可以声明一个泛型类 MyGenericClass,这样,类型参数 T 就可以实现 ICompara ...

  2. 令人惊叹的HTML5动画及源码分析下载

    HTML5非常酷,利用HTML5制作动画简直让我们忘记了这世界上还有flash的存在.今天我们要分享的一些HTML5动画都还不错,有些动画设计还是挺别出心裁的.另外,每一款HTML5动画都提供源代码下 ...

  3. unity3d 调用Start 注意

    在unity3d中,同一个脚本被绑定到多个物体上的时候,只有active的物体才会调用void Start ()  方法, 如果物体是NO Active 的状态,则不会调用Start,Awake也不会 ...

  4. Mac eclipse 连接安卓手机调试 adb

    echo 手机厂商号 >>  ~/.android/adb_usb.ini  ~ echo 0x18d1 >>  ~/.android/adb_usb.ini 重启系统即可 环 ...

  5. Unity3D编辑器之不实例化Prefab获取删除更新组件

    原文链接:http://www.xuanyusong.com/archives/3727

  6. python 读取csv文件

    python中有一个读写csv文件的包,直接import csv即可 新建test.csv 1.写 import csv with open("test.csv","w& ...

  7. showModalDialog介绍

    基本介绍:          showModalDialog()         (IE 4+ 支持)          showModelessDialog()      (IE 5+ 支持)    ...

  8. maven的多环境配置

    <profiles> <profile> <id>dev</id> <activation> <activeByDefault> ...

  9. centos7 安装 最新版本的docker

    yum update # vim /etc/yum.repos.d/docker.repo //添加以下内容 [dockerrepo] name=Docker Repository baseurl=h ...

  10. Android零碎知识点 1

    Android零碎知识点 1   Android在2.3版本上开始支持KeyEvent.KEYCODE_PAGE_DOWN以及KeyEvent.KEYCODE_PAGE_UP的操作.   Androi ...