• 一个Win32 API实例类(代码收集)


      最近看到别人代码中一个很好的功能类,该类是一个Win32 API实例类,该类功能包括:同一程序禁止启动多次;获取任意窗体;恢复窗体状态;设置窗体焦点等。

    该类很实用,与大家分享一下:

      

     1     /// Summary description for ProcessUtils.
     2     public static class ProcessUtils
     3     {
     4         private static Mutex mutex = null;
     5 
     6         /// Determine if the current process is already running
     7         public static bool ThisProcessIsAlreadyRunning()
     8         {
     9             // Only want to call this method once, at startup.
    10             Debug.Assert(mutex == null);
    11 
    12             // createdNew needs to be false in .Net 2.0, otherwise, if another instance of
    13             // this program is running, the Mutex constructor will block, and then throw 
    14             // an exception if the other instance is shut down.
    15             bool createdNew = false;
    16 
    17             mutex = new Mutex(false, Application.ProductName, out createdNew);
    18 
    19             Debug.Assert(mutex != null);
    20 
    21             return !createdNew;
    22         }
    23 
    24         [DllImport("user32.dll", SetLastError = true)]
    25         static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    26 
    27         [DllImport("user32.dll")]
    28         [return: MarshalAs(UnmanagedType.Bool)]
    29         static extern bool SetForegroundWindow(IntPtr hWnd);
    30 
    31         [DllImport("user32.dll")]
    32         static extern bool IsIconic(IntPtr hWnd);
    33 
    34         [DllImport("user32.dll")]
    35         static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
    36 
    37         const int SW_RESTORE = 9;
    38 
    39         [DllImport("user32.dll")]
    40         static extern IntPtr GetLastActivePopup(IntPtr hWnd);
    41 
    42         [DllImport("user32.dll")]
    43         static extern bool IsWindowEnabled(IntPtr hWnd);
    44 
    45         /// Set focus to the previous instance of the specified program.
    46         public static void SetFocusToPreviousInstance(string windowCaption)
    47         {
    48             // Look for previous instance of this program.
    49             IntPtr hWnd = FindWindow(null, windowCaption);
    50 
    51             // If a previous instance of this program was found...
    52             if (hWnd != null)
    53             {
    54                 // Is it displaying a popup window?
    55                 IntPtr hPopupWnd = GetLastActivePopup(hWnd);
    56 
    57                 // If so, set focus to the popup window. Otherwise set focus
    58                 // to the program's main window.
    59                 if (hPopupWnd != null && IsWindowEnabled(hPopupWnd))
    60                 {
    61                     hWnd = hPopupWnd;
    62                 }
    63 
    64                 SetForegroundWindow(hWnd);
    65 
    66                 // If program is minimized, restore it.
    67                 if (IsIconic(hWnd))
    68                 {
    69                     ShowWindow(hWnd, SW_RESTORE);
    70                 }
    71             }
    72         }
    73     }
  • 相关阅读:
    AMF序列化技巧
    为什么用ByteArray序列化的对象如此小?
    解决Asp.net中翻页问题的自定义用户控件
    新建对象:反射会调用构造函数,clone不会调用构造函数
    Java 的传值小例子
    JDK中设计模式
    tryfinally中的返回值
    c++类中的常量(注意)
    创建有个性的对话框之MFC篇(转)
    用VC在IE浏览器的工具条上添加命令按钮(转 可以借鉴)
  • 原文地址:https://www.cnblogs.com/wuhenke/p/1711380.html
Copyright © 2020-2023  润新知