我正在尝试从我的应用程序中关闭chrome。
我使用以下方法:
public class CloseChrome
{
static int WM_CLOSE = 0x0010;
static int WM_QUIT = 0x0012;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
static public void closeCrome()
{
var process = Process.GetProcesses();
foreach (var item in process)
{
if (item.ProcessName.Contains("chrome"))
{
//item.Kill();
int ret = SendMessage(item.Handle, WM_CLOSE, 0, 0);
Console.WriteLine("Chrome Reply: " + a);
}
}
}
}
使用kill方法会杀死chrome进程,但是当我发送WM_CLOSE消息时,即使sendMessage的返回值为0,也没有任何反应。我做错了是chrome只是忽略了我的要求吗?
答案 0 :(得分:1)
Process.Handle将是进程的HANDLE,而不是主窗口的HWND。事实上,一个进程可以拥有许多窗口,因此主窗口的概念并不真正适用。
您需要做的是调用(csharp等效的)EnumWindows
,然后调用GetWindowProcessThreadId
来测试每个HWND以查看它是否属于您的目标进程。
更常见的替代方法是使用Spy ++检查目标窗口以查看类名是否非常独特,如果是,则可以使用FindWindow
。