程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#窗話柄現單例形式的辦法

C#窗話柄現單例形式的辦法

編輯:C#入門知識

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; {隱蔽窗口}

以上就是本文的進修內容,願望年夜家可以愛好。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved