FindWindow和SetForegroundWindow有哪些替代方案?

18

我正在寻找替代旧版User32.dll用于使用FindWindow()SetForegroundWindow()切换到另一个应用程序的方法。

我找到了使用Process.GetProcessesByName()替代第一个方法,但是我没有看到对应的方法将应用程序设置为活动/前台。

是否有一种不使用方式的User32.dll来实现此操作的方法?

谢谢您的帮助。

编辑

尽管@Sorceri的答案不是我在寻找的答案,但我已经接受了他的答案。


2
使用 SetForegroundWindow 有什么问题吗?Windows 操作系统在 Win32 子系统中跟踪前景窗口,因此无论如何,您都只需要 P/Invoke 到 user32.dll - Michael Graczyk
@MichaelGraczyk:或者至少,我们认为是这样安全的... :) - Chibueze Opata
1
在Windows桌面上,我必须使用user32.dll,而在Windows CE上,我必须使用coredll.dll。因此,使用DLLImport总是显示您添加了静态依赖项,这是错误的。 - fdomig
如果您需要切换到您的应用程序,这个链接可以回答您的问题:https://dev59.com/61fUa4cB1Zd3GeqPFCev#32322918 - Randall Flagg
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()方法


那么,在我使用这种方法启动所需的进程后,只要我的应用程序实际上响应按键,我是否可以毫不犹豫地使用SendKeys.SendWait("{ENTER}");呢? - HanH1113
SendWait的文档表明你可以这样做 - 如果有效请告诉我们! - noelicus
我已经尝试过了,奇怪的是它有时候会工作,这对于机器来说真的很奇怪。问题通常在于计算机只会按照我们的指示去执行,而不一定是我们想要的。我可能需要询问一个全新的问题。 - HanH1113

3

一个替代SetForeGroundWindow的方法是VisualBasic中的AppActivate。

使用方法如下:

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

仅仅因为它在VisualBasic命名空间中并不意味着你不能在C#中使用它。

完整文档


3
你可以使用SetActiveWindow代替SetForeGroundWindow。我建议您浏览所有Windows操作API函数,看看是否有你所缺少的内容。
另外,请注意,您可以通过Process.Handle属性获取System.Diagnostics.Process对象的句柄。

1

您可以使用 System.Diagnostics.Process Object 来实现 FindWindow 的等效功能。目前还没有 SetForegroundWindow 的等效功能。您需要使用 Pinvoke 与 SetForgroundWindow 配合使用。

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

1
这意味着我还是必须处理user32.dll吗?听起来有点奇怪,竟然没有其他选择... - fdomig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接