无痕客

落花无情,流水无痕……

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

  最近看到别人代码中一个很好的功能类,该类是一个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     }

 

 

posted on 2010-04-13 20:57  无痕客  阅读(1849)  评论(0编辑  收藏  举报