如何在C#中使用WM_Close?

任何人都可以提供一个如何使用WM_CLOSE关闭像记事本这样的小应用程序的例子吗?

如果您已有要发送的句柄。

...Some Class... [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); //I'd double check this constant, just in case static uint WM_CLOSE = 0x10; public void CloseWindow(IntPtr hWindow) { SendMessage(hWindow, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); } ...Continue Class... 

掌握手柄可能很棘手。 控制后代类(基本上是WinForms)有Handle,你可以使用EnumWindows枚举所有顶级窗口(这需要更高级的p / invoke,尽管只是略微)。

假设您要关闭记事本。 以下代码将执行此操作:

  private void CloseNotepad(){ string proc = "NOTEPAD"; Process[] processes = Process.GetProcesses(); var pc = from p in processes where p.ProcessName.ToUpper().Contains(proc) select p; foreach (var item in pc) { item.CloseMainWindow(); } } 

注意事项:

如果记事本有一些未保存的文本,它将弹出“你想保存….?” 对话框或者如果进程没有UI,它将抛出exception

  'item.CloseMainWindow()' threw an exception of type 'System.InvalidOperationException' base {System.SystemException}: {"No process is associated with this object."} 

如果您想立即强行关闭,请更换

 item.CloseMainWindow() 

 item.Kill(); 

如果你想采用PInvoke方式,你可以使用所选项目的句柄。

 item.Handle; //this will return IntPtr object containing handle of process.