WM_CLOSE消息似乎没有关闭chrome

时间:2016-04-28 14:18:01

标签: c# google-chrome winapi pinvoke

我正在尝试从我的应用程序中关闭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只是忽略了我的要求吗?

1 个答案:

答案 0 :(得分:1)

Process.Handle将是进程的HANDLE,而不是主窗口的HWND。事实上,一个进程可以拥有许多窗口,因此主窗口的概念并不真正适用。

您需要做的是调用(csharp等效的)EnumWindows,然后调用GetWindowProcessThreadId来测试每个HWND以查看它是否属于您的目标进程。

更常见的替代方法是使用Spy ++检查目标窗口以查看类名是否非常独特,如果是,则可以使用FindWindow