zoukankan      html  css  js  c++  java
  • 让某个软件无法被操作员最小化(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/

  • 相关阅读:
    cookie 当天12点 过期
    ps 前端常用技巧
    定时器遇到的坑
    ajax 会遇到的问题总结
    立即执行函数表达式 项目经常用到js 代码Module模式
    Hello world
    div position:fixed后,水平居中的问题
    关于div中图片水平垂直居中的问题
    [学习]Activiti流程引擎 入门(1) 初步认识
    SSO框架介绍前篇
  • 原文地址:https://www.cnblogs.com/hackpig/p/5794290.html
Copyright © 2011-2022 走看看