C#窗話柄現單例形式的辦法。本站提示廣大學習愛好者:(C#窗話柄現單例形式的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C#窗話柄現單例形式的辦法正文
重要是應對這類需求:軟件只許可啟動一次。
將這個成績轉化一下,可以如許描寫:關於一個軟件,在啟動一個過程以後,不許可啟動其它過程,假如第二次翻開法式,就把曾經啟動的誰人過程的窗口放到最前端顯示。
C# winfrom運用在啟動以後會起首履行program.cs裡的代碼,所以須要在這裡下手。啟動後,檢測能否有雷同過程名的過程,假如有,就把誰人過程的窗口提到前端,然後封閉本身。
用法:把你的program.cs改革成這個模樣:
static class Program { //windows api,用於顯示代碼 [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SetForegroundWindow(IntPtr hWnd); /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { //焦點代碼 Process currProc = Process.GetCurrentProcess(); Process[] runningProc = Process.GetProcesses(); //檢討規矩,看過程名能否雷同。可以本身靈巧定制,好比須要檢討用戶名之類的。 var searchedProc=from a in runningProc where a.ProcessName == currProc.ProcessName select a; if (searchedProc.Count() > 1) { //選出和以後過程過程名雷同,然則id分歧的誰人過程 Process firstProc = searchedProc.FirstOrDefault(a => a.Id != currProc.Id); IntPtr firstProcWindow = firstProc.MainWindowHandle; SetForegroundWindow(firstProcWindow); currProc.Kill(); } //-------end--------- Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } }
====================================================
關於窗口前端顯示和置頂,一共觸及到3個windows的API
//顯示窗口
ShowWindow(hWnd, SW_NORMAL);
//前端顯示
SetForegroundWindow(hWnd);
//窗口置頂
SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
個中這個SetWindowPos最經常使用,用於設定窗口的地位,最多見用處是給窗口設定為置頂,同等於winform裡的this.TopMost=true;
用法:
WinAPI: SetWindowPos - 轉變窗口的地位與狀況
SetWindowPos(
hWnd: HWND; {窗口句柄}
hWndInsertAfter: HWND; {窗口的 Z 次序}
X, Y: Integer; {地位}
cx, cy: Integer; {年夜小}
uFlags: UINT {選項}
): BOOL;
//hWndInsertAfter 參數可選值:
HWND_TOP = 0; {在後面}
HWND_BOTTOM = 1; {在前面}
HWND_TOPMOST = HWND(-1); {在後面, 位於任何頂部窗口的後面}
HWND_NOTOPMOST = HWND(-2); {在後面, 位於其他頂部窗口的前面}
//uFlags 參數可選值:
SWP_NOSIZE = 1; {疏忽 cx、cy, 堅持年夜小}
SWP_NOMOVE = 2; {疏忽 X、Y, 不轉變地位}
SWP_NOZORDER = 4; {疏忽 hWndInsertAfter, 堅持 Z 次序}
SWP_NOREDRAW = 8; {不重繪}
SWP_NOACTIVATE = $10; {不激活}
SWP_FRAMECHANGED = $20; {強迫發送 WM_NCCALCSIZE 新聞, 普通只是在轉變年夜小時才發送此新聞}
SWP_SHOWWINDOW = $40; {顯示窗口}
SWP_HIDEWINDOW = $80; {隱蔽窗口}
以上就是本文的進修內容,願望年夜家可以愛好。