c#中将WM_CLOSE消息发送到没有窗口的进程的方法
開(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)題。
- 上一篇: int 和 Integer 的区别
- 下一篇: kibana 安装