亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#向無窗口的進程發送消息

2020-01-24 01:09:40
字體:
來源:轉載
供稿:網友

注:本文適用.net2.0+的winform程序
一個winform程序,我希望它不能多開,那么在用戶啟動第二個實例的時候,作為第二個實例來說,大概可以有這么幾種做法:

1.彈個窗告知用戶【程序已運行】之類,用戶點擊彈窗后,退出自身

2.什么都不做,默默退出自身

3.讓已運行的第一個實例把它的窗體顯示出來,完了退出自身

顯然第3種做法更地道,實現該效果的核心問題其實是:如何顯示指定進程的窗口?

首先想到的是調用ShowWindow、SetForegroundWindow等API,配合使用可以將被遮擋、最小化的窗口前排顯示出來,這也是很多涉及到這種案例的網文介紹的方法,此法的局限在于,目標進程的主窗口必須存在,準確說是要有有效的主窗口句柄,表現在訪問Process.MainWindowHandle能得到一個非IntPtr.Zero的值,即有效的句柄;或者用spy類工具能看到該進程下有至少一個窗口;或者按alt+tab能將它的窗口切換出來。

那如果進程沒窗口怎么辦?先說一下什么情況下進程會沒窗口,很簡單,讓Form.Visible=false(或者Form.Hide(),等價的)就行,此時窗體就消失了,既不可見,也沒有對應的任務欄按鈕,alt+tab也切不出來。當程序中的所有Form都Hide后,訪問該進程的MainWindowHandle會得到IntPtr.Zero,這就是無窗口進程。那什么樣的程序會這么干,太多了好吧,各種音樂播放器,殺軟什么的,都允許【關閉/最小化到系統托盤】,在你點叉或者最小化后,窗體就會隱藏,只留一個圖標在托盤區。由于這種進程的MainWindowHandle拿不到有效句柄,所以上面那些API是用不了的,只能另想辦法。

回到問題【如何顯示指定進程的窗口】,如果你的程序不允許關閉到托盤區,始終存在窗口的話(最小化也是存在),那你愉快的用ShowWindow、SetForegroundWindow等API就好,不用繼續。但如果你的程序要像播放器殺軟那樣允許用戶隱藏窗口的話,那還得繼續折騰,此時問題變成【如何讓無窗口的進程顯示窗口】,我的思路是這樣:既然目標進程沒窗口,我沒辦法純粹用外部手段操作到它的窗體,但因為程序是我自己寫的,可不可以來個里應外合,辦了這事。比如向它發一條特定消息,它在收到該消息后,心領神會,把自己的窗口顯示出來~到時候榮華富貴享之sorry入戲了。這個思路主要涉及兩個問題,怎么發和怎么收,至于收到后如何前排顯示窗口之類,小case。

怎么發

SendMessage/PostMessage自然是指不上的,因為這倆貨也是基于窗口的,其實我一度懷疑走消息這條路是否可行,這涉及到一個原理問題,就是如果消息一定是只能發送給窗口的話,那注定此路不通,只能考慮別的進程間通信方案。好在了解到PostThreadMessage這個API,解決了我的問題。該API是向指定線程發送消息(MSDN文檔在此),這也說明在原理上,消息并非只可以發給窗口,還可以發給線程,至于還能不能發給別的什么東西就不知道了。先看一下發送語句:

void Main(){...//向目標進程的主線程發送消息PostThreadMessage(Process.GetProcessById(pid).Threads[0].Id, 0x80F0, IntPtr.Zero, IntPtr.Zero);...}[return: MarshalAs(UnmanagedType.Bool)][DllImport("user32.dll", SetLastError = true)]public static extern bool PostThreadMessage(int threadId, uint msg, IntPtr wParam, IntPtr lParam); 

API的第1個參數是目標線程的ID。注意兩點:①此ID是系統全局的線程ID,并非Thread.ManagedThreadId這種“假”ID;②目標線程必須存在消息循環。winform的主線程往往就是UI線程,天然存在消息循環,所以無需考慮這個問題。第2個參數是要發送的消息ID。我們的目的是發一條收發雙方約定的消息,所以這個消息要夠特別,不能跟系統消息撞衫,所以范圍最好介于0x8001~0xBFFF之間,這是系統留給應用程序自用的消息段(WM_APP)。后面倆參數我沒用,你想讓消息更特別一點,或想攜帶其它信息的話也可以用上。方法返回true/false分別代表發送成功/失敗。

另外,目標進程也許有多個線程,其中哪個才是能收消息的主線程我沒有科學的判斷方法,大膽臆測就是Process.Threads集合中的第1項,這個猜測至今工作良好,不管它。若您有科學判斷法,請告知~謝謝。

怎么收

由于消息是走線程過來的,所以別想著在主窗口的WndProc中去收,再說消息過來的時候,主窗口存不存在都是個問題。要用應用程序級別的消息篩選器來收,篩選器是個實現System.Windows.Forms.IMessageFilter接口的類(MSDN),該接口只需實現一個方法:bool PreFilterMessage(ref Message m),方法邏輯是,如果收到的消息m是你要處理并吃掉的,就返回true,其余消息則返回false放行。整個篩選器像這樣:

class MsgFilter : IMessageFilter{public bool PreFilterMessage(ref Message m){if (m.Msg == 0x80F0){DoSomething(); //顯示窗口或其它事return true;}return false;}}

事實上我收到消息后并不是直接做顯示窗口相關的事,而是引發一個事件,主窗體注冊該事件,在事件處理方法中再寫顯示窗口相關的代碼。這是設計上的考量,與本文主旨無關,不多說。

篩選器寫好后,還得把它添加到一個地方它才能工作,什么時候添加就什么時候才開始發揮作用,所以最好盡早添加,例如在main的開頭。像這樣:

void Main(){Application.AddMessageFilter(new MsgFilter());...}

至此,收發的問題解決。這實質上是一個進程間通信問題,所以其實任何進程通信手段都可以應用在本文的案例,走消息只是其中一種手段。

以上所述是小編給大家介紹的C#向無窗口的進程發送消息的相關知識,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲美女中文字幕| 精品久久久久久中文字幕大豆网| 精品国产一区二区三区久久狼5月| 亚洲网站视频福利| 亚洲一区久久久| 亚洲人午夜精品免费| 亚洲风情亚aⅴ在线发布| 午夜精品美女自拍福到在线| 成人精品一区二区三区| 中文字幕亚洲欧美| 国产欧美日韩专区发布| 欧美性一区二区三区| 亚洲精品日产aⅴ| 在线电影欧美日韩一区二区私密| 亚洲欧美另类自拍| 日韩av中文字幕在线免费观看| 国产精品欧美亚洲777777| 国产精品私拍pans大尺度在线| 岛国视频午夜一区免费在线观看| 国产盗摄xxxx视频xxx69| 日韩av影视在线| 精品国产一区二区三区久久狼5月| 国产欧美久久一区二区| 午夜精品福利在线观看| 久久国产精品视频| 欧美国产日韩一区二区三区| 日韩久久精品电影| 亚洲精品mp4| 精品视频偷偷看在线观看| 久久精品99久久久香蕉| 久久久久久久久久久成人| 日韩动漫免费观看电视剧高清| 日韩欧美在线视频日韩欧美在线视频| 不用播放器成人网| 久久精品91久久久久久再现| 欧美国产亚洲视频| 中文字幕久精品免费视频| 国产欧美一区二区三区在线| 91免费在线视频| 日日骚av一区| 欧美日韩另类字幕中文| 国产精品久久久久久久电影| 亚洲精品www久久久久久广东| 欧美电影免费观看高清完整| 2019中文字幕免费视频| 国产精品一区二区三区久久久| 91香蕉亚洲精品| 亚洲图中文字幕| 国产精品丝袜久久久久久高清| 久久久久久久久久国产精品| 久久激情五月丁香伊人| 国产一区二区三区中文| 亚洲欧美日韩久久久久久| 国产精国产精品| 97精品视频在线| 国产网站欧美日韩免费精品在线观看| 日本精品免费一区二区三区| 亚洲欧美日韩一区二区在线| 国产精品美女呻吟| 成人午夜小视频| 日韩精品一区二区视频| 亚洲女在线观看| 成人性生交大片免费观看嘿嘿视频| 亚洲第一福利在线观看| 亚洲女人天堂视频| 国产91精品在线播放| 456亚洲影院| 久久久精品久久久久| 中文字幕亚洲二区| 日韩av综合网站| 亚洲精品一区av在线播放| 7m精品福利视频导航| 日韩av在线一区二区| www.日韩免费| 久久精品国产99国产精品澳门| 黑人巨大精品欧美一区二区三区| 国产精品你懂得| 成人激情视频在线播放| 91精品国产成人www| 色综合伊人色综合网站| 黄色成人在线免费| 日本亚洲欧美成人| 成人在线观看视频网站| 69影院欧美专区视频| 国产一区二区三区在线看| 欧美专区福利在线| 久久久久久国产精品久久| 精品国产老师黑色丝袜高跟鞋| 热久久99这里有精品| 日本欧美一级片| 高清欧美性猛交| 九九精品在线播放| 热门国产精品亚洲第一区在线| 欧美黑人性视频| 国内偷自视频区视频综合| 国产成人久久精品| 中文字幕亚洲无线码在线一区| 久久免费视频观看| 欧美亚洲第一区| 欧美国产日本高清在线| 国产精品视频中文字幕91| 欧美日韩美女在线| 91免费看片网站| 日韩精品在线免费观看视频| 国产成人综合亚洲| 亚洲春色另类小说| 亚洲国内精品在线| 亚洲美女免费精品视频在线观看| 亚洲欧美综合v| 在线精品国产成人综合| 国产一区二区三区精品久久久| 国产一区二区三区在线观看视频| 丝袜一区二区三区| 亚洲片国产一区一级在线观看| 亚洲高清av在线| 欧美日韩国产综合视频在线观看中文| 成人性生交大片免费看小说| 久久综合九色九九| 久久深夜福利免费观看| 国语对白做受69| xvideos成人免费中文版| 久久免费视频在线观看| 欧美日韩国产91| 一区二区成人精品| 亚洲精品suv精品一区二区| 欧美精品手机在线| 欧美xxxx综合视频| 久久中文字幕国产| 久久人人爽人人爽人人片av高请| 欧美日韩在线一区| 久久久爽爽爽美女图片| 亚洲自拍偷拍第一页| 日韩在线高清视频| 美女性感视频久久久| 国产激情综合五月久久| 日本久久精品视频| 九九九久久久久久| 2019日本中文字幕| 国产精品91久久| 国产精品第一区| 精品国产乱码久久久久久婷婷| 欧美成人一区二区三区电影| 国产精品自拍视频| 日韩在线视频中文字幕| 91久久国产婷婷一区二区| 欧美大全免费观看电视剧大泉洋| 久久久久久久久国产精品| 成人国产精品一区| 成人黄色激情网| 国产亚洲欧洲在线| 久久久久亚洲精品国产| 亚洲一区第一页| 久久999免费视频| 亚洲精品一区久久久久久| 国产精品视频99| 日本一欧美一欧美一亚洲视频| 亚洲欧美中文在线视频| 久久福利视频网| 国产视频欧美视频| 国产成人免费91av在线| 国产香蕉97碰碰久久人人| 国产午夜精品视频免费不卡69堂| 久久久久亚洲精品国产| 欧美激情视频免费观看|