有人能为我提供一个如何使用WM_CLOSE关闭记事本等小应用程序的示例吗?
答案 0 :(得分:11)
如果您已经有一个发送到的句柄。
...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,尽管只是略微)。
答案 1 :(得分:1)
假设您要关闭记事本。以下代码将执行此操作:
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,它将抛出异常
'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.