【发布时间】:2014-04-21 12:41:44
【问题描述】:
开始一个进程 -
ProcessStartInfo psi = new ProcessStartInfo("G:\\SampleWinApp.exe");
psi.UseShellExecute = false;
psi.CreateNoWindow = true;
Process prcs = Process.Start(psi);
使用 PostMessage 发送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;
}
使用CreateNoWindow = false 启动exe,发送WM_CLOSE 消息并且应用程序正常关闭。
使用CreateNoWindow = true,WM_CLOSE 消息永远不会到达进程。甚至 PostThreadMessage 似乎也不起作用。有没有办法发送 WM_CLOSE 消息?我已经找了一天来解决这个问题.. 运气不好。
编辑:为每个应用程序安装一个 Windows 服务。启动/停止服务启动/停止应用程序。目前我们在服务停止时终止应用程序。作为蛮力杀戮,应用程序不会优雅地死去。一些应用程序侦听CTRL signals。现在,我只需要某种方式将 WM_CLOSE 消息发送到这些应用程序。
Edit2:如果有窗口,WM_CLOSE 会触发CTRL_CLOSE_EVENT。但是当任何进程以 CreateNoWindow = true 启动时,这永远不会触发。
【问题讨论】:
-
好吧,您不能将消息发布到不存在的窗口句柄。
-
@SriramSakthivel:对不起,错字。现已编辑。
-
@500-InternalServerError:任何解决方法?
-
@AseemGautam 你可以杀死它。
-
您可以将 WM_CLOSE 发送到没有窗口的进程,但它永远不会做任何事情,因为它没有消息泵、没有 windowproc 和 defwinproc。如果您想要其他方法来关闭事物,请继续阅读。如果没有,我们就完成了。