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

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

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

主要是應(yīng)對(duì)這種需求:軟件只允許啟動(dòng)一次。

將這個(gè)問(wèn)題轉(zhuǎn)化一下,可以這樣描述:對(duì)于一個(gè)軟件,在啟動(dòng)一個(gè)進(jìn)程之后,不允許啟動(dòng)其它進(jìn)程,如果第二次打開(kāi)程序,就把已經(jīng)啟動(dòng)的那個(gè)進(jìn)程的窗口放到最前端顯示。

C# winfrom應(yīng)用在啟動(dòng)之后會(huì)首先執(zhí)行program.cs里的代碼,所以需要在這里下手。啟動(dòng)后,檢測(cè)是否有相同進(jìn)程名的進(jìn)程,如果有,就把那個(gè)進(jìn)程的窗口提到前端,然后關(guān)閉自己。

用法:把你的program.cs改造成這個(gè)樣子:

 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ī)則,看進(jìn)程名是否相同??梢宰约红`活定制,比如需要檢查用戶(hù)名之類(lèi)的。
      var searchedProc=from a in runningProc
               where a.ProcessName == currProc.ProcessName
               select a;
 
      if (searchedProc.Count() > 1)
      {
        //選出和當(dāng)前進(jìn)程進(jìn)程名相同,但是id不同的那個(gè)進(jìn)程
        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());
    }
  }

====================================================


關(guān)于窗口前端顯示和置頂,一共涉及到3個(gè)windows的API
   //顯示窗口
   ShowWindow(hWnd, SW_NORMAL);

   //前端顯示
   SetForegroundWindow(hWnd);

   //窗口置頂
   SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);

其中這個(gè)SetWindowPos最常用,用于設(shè)定窗口的位置,最常見(jiàn)用途是給窗口設(shè)定為置頂,等同于winform里的this.TopMost=true;

用法:

WinAPI: SetWindowPos - 改變窗口的位置與狀態(tài)

SetWindowPos(
hWnd: HWND; {窗口句柄}
hWndInsertAfter: HWND; {窗口的 Z 順序}
X, Y: Integer; {位置}
cx, cy: Integer; {大小}
uFlags: UINT {選項(xiàng)}
): BOOL;

//hWndInsertAfter 參數(shù)可選值:
HWND_TOP = 0; {在前面}
HWND_BOTTOM = 1; {在后面}
HWND_TOPMOST = HWND(-1); {在前面, 位于任何頂部窗口的前面}
HWND_NOTOPMOST = HWND(-2); {在前面, 位于其他頂部窗口的后面}

//uFlags 參數(shù)可選值:
SWP_NOSIZE = 1; {忽略 cx、cy, 保持大小}
SWP_NOMOVE = 2; {忽略 X、Y, 不改變位置}
SWP_NOZORDER = 4; {忽略 hWndInsertAfter, 保持 Z 順序}
SWP_NOREDRAW = 8; {不重繪}
SWP_NOACTIVATE = $10; {不激活}
SWP_FRAMECHANGED = $20; {強(qiáng)制發(fā)送 WM_NCCALCSIZE 消息, 一般只是在改變大小時(shí)才發(fā)送此消息}
SWP_SHOWWINDOW = $40; {顯示窗口}
SWP_HIDEWINDOW = $80; {隱藏窗口}

以上就是本文的學(xué)習(xí)內(nèi)容,希望大家可以喜歡。

相關(guān)文章

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

    C# Socket粘包處理講解示例

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

    C#小知識(shí)之有趣的類(lèi)型靜態(tài)構(gòu)造器

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

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

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

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

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

    C#的內(nèi)存回收代碼

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

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

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

    C#使用WMI實(shí)現(xiàn)監(jiān)聽(tīng)進(jìn)程的啟動(dòng)和關(guān)閉

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

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

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

    C#串口通信總是丟數(shù)據(jù)的原因及解決方案

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

    淺談C#泛型的用處與特點(diǎn)

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

最新評(píng)論

西吉县| 玉山县| 和平区| 正蓝旗| 苏尼特左旗| 湖北省| 敖汉旗| 崇文区| 通渭县| 永宁县| 慈利县| 黄骅市| 龙泉市| 麻栗坡县| 井研县| 葫芦岛市| 郴州市| 扶绥县| 威宁| 手游| 饶河县| 河池市| 班玛县| 林周县| 育儿| 营口市| 太湖县| 谢通门县| 谢通门县| 瓮安县| 城口县| 砚山县| 江达县| 新绛县| 双流县| 保山市| 肇庆市| 福安市| 张掖市| 连平县| 平顺县|