17

我正在寻找使用和User32.dll切换到不同应用程序的旧版本的替代方案。FindWindow()SetForegroundWindow()

我确实找到了第一个使用的替代方法,Process.GetProcessesByName()但我没有看到相应的方法来切换(设置活动/前台)到该应用程序。

有没有办法在不使用旧方法的情况下做到这一点User32.dll

感谢您的帮助。

编辑

我接受了@Sorceri 的答案,尽管这不是我想要的答案。

4

4 回答 4

39

回答:没有。

但是,为了帮助下一个想找到一个窗口并从 C# 激活它的好奇者,您必须执行以下操作:

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

void ActivateApp(string processName)
{
    Process[] p = Process.GetProcessesByName(processName);

    // Activate the first application we find with this name
    if (p.Count() > 0)
        SetForegroundWindow(p[0].MainWindowHandle);
}

例如,要将记事本放在前面,您可以调用:

ActivateApp("notepad");

作为旁注 - 对于那些试图将应用程序中的窗口置于前台的人来说,只需调用Activate() 方法

于 2012-10-06T10:30:07.620 回答
3

您可以SetActiveWindow用作SetForeGroundWindow. 我想说你应该检查所有的Windows Manipulation Api Functions,看看你是否遗漏了一些东西。

另外请注意,您可以System.Diagnostics.Process通过Process.Handle属性获取对象的句柄。

于 2012-07-16T21:32:10.007 回答
3

SetForeGroundWindow 的替代方法是 VisualBasic 的 AppActivate

像这样称呼它

Microsoft.VisualBasic.Interaction.AppActivate("WindowTitle")

Just because it is in the VisualBasic namespace doesn't mean you can't use it in C#.

Full Documentation here

于 2016-06-26T19:11:26.277 回答
1

您可以使用System.Diagnostics.Process ObjectFindWindow 等效项。目前没有 SetForegroundWindow 的等效项。您将希望将 Pinvoke 与 SetForgroundWindow 一起使用。

[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);
于 2012-07-16T21:18:10.627 回答