【问题标题】:Fail to close IE process by user32.dll function calluser32.dll函数调用关闭IE进程失败
【发布时间】:2013-12-09 22:40:48
【问题描述】:

我关注this ask,打开一个这样的进程,

// open IE (ok)
Process process = System.Diagnostics.Process.Start("IEXPLORE.EXE", "www.google.com");
IntPtr handle = process.Handle;

// refresh it (ok)
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

ShowWindow(handle, 1);
SendKeys.SendWait("{F5}");

// however, fail to close it ( NOT ok)
[DllImport("user32.dll")]
static extern bool CloseWindow(IntPtr hWnd);

CloseWindow(handle); // don't work

没有错误,没有异常发生。我检查了 MSDN 关于CLoseWindow 但仍然失败。有什么想法吗?谢谢!

更新: 好的,我修复了它并使它更健壮。 调用此进程的 CloseMainWindow() 函数有效

[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);

bool bOk = ShowWindow(process.MainWindowHandle, 1);
if (bOk) {
    bOk = SetForegroundWindow(process.MainWindowHandle);
    if (bOk){
        process.CloseMainWindow();
    }
}

【问题讨论】:

  • ShowWindow() 返回布尔值。 从不忽略 winapi 返回值。

标签: c# internet-explorer process


【解决方案1】:

Process.Handle 是一个进程句柄,而不是一个窗口句柄,所以窗口命令不会对其起作用。尝试使用 Process.MainWindowHandle 属性。请注意,如果 IE 产生额外的进程或打开额外的窗口,这整个事情可能无法正常工作。

【讨论】:

  • 如果我可以确定它是 IE 的进程并获得它的窗口句柄,这是否意味着我没有任何额外的进程句柄可以得到?我试图获取 MainWindowHandle 而不是 handle 属性,现在效果更好。谢谢。
【解决方案2】:

很抱歉回答我自己的问题。实际上,如果没有@fejesjoco 的提醒,我找不到答案。我真的很感激。

答案是调用这个进程的 CloseMainWindow() 函数,像这样

[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);

bool bOk = ShowWindow(process.MainWindowHandle, 1);
if (bOk) {
    bOk = SetForegroundWindow(process.MainWindowHandle);
    if (bOk){
        process.CloseMainWindow();
    }
}

【讨论】:

    猜你喜欢
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2018-10-30
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2021-03-28
    相关资源
    最近更新 更多