最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#窗口實現(xiàn)單例模式的方法

 更新時間:2015年07月30日 11:01:45   作者:夜風聆雨  
本文介紹了C#窗口實現(xiàn)單例模式的方法,對于一個軟件如果第二次打開程序,就把已經啟動的那個進程的窗口放到最前端顯示,需要了解的朋友可以參考下

主要是應對這種需求:軟件只允許啟動一次。

將這個問題轉化一下,可以這樣描述:對于一個軟件,在啟動一個進程之后,不允許啟動其它進程,如果第二次打開程序,就把已經啟動的那個進程的窗口放到最前端顯示。

C# winfrom應用在啟動之后會首先執(zhí)行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();
      //檢查規(guī)則,看進程名是否相同??梢宰约红`活定制,比如需要檢查用戶名之類的。
      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 - 改變窗口的位置與狀態(tài)

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; {強制發(fā)送 WM_NCCALCSIZE 消息, 一般只是在改變大小時才發(fā)送此消息}
SWP_SHOWWINDOW = $40; {顯示窗口}
SWP_HIDEWINDOW = $80; {隱藏窗口}

以上就是本文的學習內容,希望大家可以喜歡。

相關文章

  • C# Socket粘包處理講解示例

    C# Socket粘包處理講解示例

    這篇文章主要介紹了C# Socket粘包處理講解,大家可以參考使用
    2013-12-12
  • C#小知識之有趣的類型靜態(tài)構造器

    C#小知識之有趣的類型靜態(tài)構造器

    這篇文章主要介紹了C#小知識之有趣的類型靜態(tài)構造器,本文直接給分實例代碼,然后分析了C#中的這一個有趣的現(xiàn)象,需要的朋友可以參考下
    2015-04-04
  • c#多線程通信之委托事件

    c#多線程通信之委托事件

    這篇文章主要介紹了c#多線程通信之委托事件,對多線程感興趣的同學可以參考下
    2021-04-04
  • C# WinForm狀態(tài)欄實時顯示當前時間(窗體狀態(tài)欄StatusStrip示例)

    C# WinForm狀態(tài)欄實時顯示當前時間(窗體狀態(tài)欄StatusStrip示例)

    這篇文章主要介紹了C# WinForm狀態(tài)欄實時顯示當前時間(窗體狀態(tài)欄StatusStrip示例),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • C#的內存回收代碼

    C#的內存回收代碼

    這篇文章主要介紹了C#的內存回收代碼,涉及到win32底層操作,具有一定的參考學習價值,需要的朋友可以參考下
    2014-10-10
  • c# 使用Task實現(xiàn)非阻塞式的I/O操作

    c# 使用Task實現(xiàn)非阻塞式的I/O操作

    這篇文章主要介紹了c# 使用Task實現(xiàn)非阻塞式的I/O操作,幫助大家更好的理解和學習c# 編程語言,感興趣的朋友可以了解下
    2020-11-11
  • C#使用WMI實現(xiàn)監(jiān)聽進程的啟動和關閉

    C#使用WMI實現(xiàn)監(jiān)聽進程的啟動和關閉

    Windows Management Instrumentation(WMI)是用于管理基于 Windows 操作系統(tǒng)的數據和操作的基礎結構,本文將使用WMI實現(xiàn)監(jiān)聽進程的啟動和關閉,感興趣的可以了解下
    2024-01-01
  • C#在線程中訪問ui元素的幾種實現(xiàn)方法

    C#在線程中訪問ui元素的幾種實現(xiàn)方法

    在C#中,特別是在Windows窗體(WinForms)或WPF應用程序中,直接從非UI線程(如后臺工作線程)訪問UI元素通常是不被允許的,如果你需要在非UI線程中更新UI元素,本文給大家介紹了C#在線程中訪問ui元素的幾種實現(xiàn)方法,需要的朋友可以參考下
    2024-07-07
  • C#串口通信總是丟數據的原因及解決方案

    C#串口通信總是丟數據的原因及解決方案

    在上位機開發(fā)中,串口通信是一個非常常見的通信方式,尤其是在與嵌入式設備、PLC、傳感器等硬件設備進行交互時,串口通信簡單、直接且廣泛應用,但它也有自己的局限性,那么,為什么你的C#串口通信總是丟數據?本文將深度分析串口通信丟數據的原因,并提供一些有效的解決方案
    2025-02-02
  • 淺談C#泛型的用處與特點

    淺談C#泛型的用處與特點

    泛型是 2.0 版 C# 語言和公共語言運行庫 (CLR) 中的一個新功能。泛型將類型參數的概念引入 .NET Framework,類型參數使得設計如下類和方法成為可能:這些類和方法將一個或多個類型的指定推遲到客戶端代碼聲明并實例化該類或方法的時候
    2013-09-09

最新評論

岐山县| 台中市| 丽江市| 大姚县| 青铜峡市| 吉木乃县| 札达县| 民县| 丰县| 奈曼旗| 陵水| 宜阳县| 静海县| 于都县| 海口市| 河间市| 商河县| 华阴市| 富裕县| 晋中市| 阿拉善右旗| 陈巴尔虎旗| 浪卡子县| 迁安市| 乌兰浩特市| 潜山县| 白城市| 昌平区| 区。| 于田县| 德令哈市| 两当县| 海南省| 叙永县| 乐陵市| 右玉县| 开平市| 宝应县| 安西县| 浦北县| 循化|