我正在寻找替代旧版User32.dll
用于使用FindWindow()
和SetForegroundWindow()
切换到另一个应用程序的方法。
我找到了使用Process.GetProcessesByName()
替代第一个方法,但是我没有看到对应的方法将应用程序设置为活动/前台。
是否有一种不使用旧方式的User32.dll
来实现此操作的方法?
谢谢您的帮助。
编辑
尽管@Sorceri的答案不是我在寻找的答案,但我已经接受了他的答案。
答案:不行。
但是,为了帮助下一个想要从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()方法。
一个替代SetForeGroundWindow的方法是VisualBasic中的AppActivate。
使用方法如下:
Microsoft.VisualBasic.Interaction.AppActivate("WindowTitle")
仅仅因为它在VisualBasic命名空间中并不意味着你不能在C#中使用它。
SetActiveWindow
代替SetForeGroundWindow
。我建议您浏览所有Windows操作API函数,看看是否有你所缺少的内容。Process.Handle
属性获取System.Diagnostics.Process
对象的句柄。您可以使用 System.Diagnostics.Process Object
来实现 FindWindow 的等效功能。目前还没有 SetForegroundWindow 的等效功能。您需要使用 Pinvoke 与 SetForgroundWindow 配合使用。
[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);
SetForegroundWindow
有什么问题吗?Windows 操作系统在 Win32 子系统中跟踪前景窗口,因此无论如何,您都只需要 P/Invoke 到user32.dll
。 - Michael Graczykuser32.dll
,而在Windows CE上,我必须使用coredll.dll
。因此,使用DLLImport
总是显示您添加了静态依赖项,这是错误的。 - fdomig