日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

c#中将WM_CLOSE消息发送到没有窗口的进程的方法

發(fā)布時(shí)間:2023/12/18 C# 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c#中将WM_CLOSE消息发送到没有窗口的进程的方法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

開(kāi)始一個(gè)過(guò)程-

?

ProcessStartInfo psi = new ProcessStartInfo("G:\SampleWinApp.exe"); psi.UseShellExecute = false;psi.CreateNoWindow = true; Process prcs = Process.Start(psi); 復(fù)制代碼

使用PostMessage發(fā)送WM_CLOSE

?

const int WM_CLOSE = 0x0010;public void SendCloseSignal(Process proc) {uint uiPid = (uint) proc.Id;bool bResult = EnumWindows(new WNDENUMPROC(EnumWindowsProc), uiPid);if (!bResult && Marshal.GetLastWin32Error() == 0) {object objWnd = processWnd[uiPid];if (objWnd != null) {IntPtr ptrWnd = (IntPtr) objWnd;PostMessage(ptrWnd, WM_CLOSE, 0, 0);return;}}foreach (ProcessThread thread in proc.Threads) {PostThreadMessage((uint) thread.Id, WM_CLOSE, UIntPtr.Zero, IntPtr.Zero);}}private static bool EnumWindowsProc(IntPtr hwnd, uint lParam) {uint uiPid = 0;if (GetParent(hwnd) == IntPtr.Zero){GetWindowThreadProcessId(hwnd, ref uiPid);if (uiPid == lParam){processWnd[uiPid] = hwnd;return false;}}return true; } 復(fù)制代碼

使用CreateNoWindow = false啟動(dòng)exe,發(fā)送WM_CLOSE消息,并正常關(guān)閉應(yīng)用程序.
如果CreateNoWindow = true,則WM_CLOSE消息永遠(yuǎn)不會(huì)到達(dá)進(jìn)程.甚至PostThreadMessage似乎也不起作用.有什么方法可以發(fā)送WM_CLOSE消息?我有一天要尋找解決辦法,..不走運(yùn).

編輯:為每個(gè)應(yīng)用程序都安裝了Windows服務(wù).啟動(dòng)/停止服務(wù)將啟動(dòng)/停止應(yīng)用程序.目前,我們?cè)诜?wù)停止時(shí)終止了該應(yīng)用程序.由于其殘酷的殺傷力,應(yīng)用程序無(wú)法正常終止.一些應(yīng)用程序監(jiān)聽(tīng)CTRL signals.現(xiàn)在,我只需要一些方法即可將WM_CLOSE消息發(fā)送到這些應(yīng)用程序.

Edit2:如果存在窗口,則WM_CLOSE會(huì)觸發(fā)CTRL_CLOSE_EVENT.但是,當(dāng)任何進(jìn)程以CreateNoWindow = true啟動(dòng)時(shí),都不會(huì)觸發(fā).

最佳答案

Is there any way to send WM_CLOSE message?

WM_CLOSE發(fā)送到窗口.如果在此過(guò)程中沒(méi)有窗口,則沒(méi)有任何可處理的消息.如果您希望關(guān)閉沒(méi)有窗口的進(jìn)程,那么發(fā)送WM_CLOSE不是解決方案.

看來(lái)您只是想終止進(jìn)程.當(dāng)控制臺(tái)進(jìn)程具有關(guān)聯(lián)的窗口時(shí),您將使用WM_CLOSE消息來(lái)觸發(fā)CTRL_CLOSE_EVENT信號(hào).

由于CTRL_CLOSE_EVENT已經(jīng)是殺死進(jìn)程的一種相當(dāng)殘酷的方式,因此,我認(rèn)為完全可以證明殺死它是合理的.您已經(jīng)有一個(gè)Process對(duì)象.只需使用Process.Kill()將其殺死.

總結(jié)

以上是生活随笔為你收集整理的c#中将WM_CLOSE消息发送到没有窗口的进程的方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。