SetForegroundWindow 没有设置焦点
Posted
技术标签:
【中文标题】SetForegroundWindow 没有设置焦点【英文标题】:SetForegroundWindow not setting focus 【发布时间】:2020-11-07 23:44:00 【问题描述】:嗨,我正在尝试获得应用程序的焦点,我在网上只能找到 SetForegroundWindow
方法,所以我尝试实现它,但它根本没有将焦点设置到应用程序,我还找到了一些关于它不可靠所以想问我是否做错了,或者是否有更好的方法将按键注入应用程序,谢谢!
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
private void JumpRL(object sender, EventArgs e)
Process[] processlist = Process.GetProcesses();
var name = processlist.Where(x => x.ProcessName == "RocketLeague").FirstOrDefault();
SetForegroundWindow(name.MainWindowHandle);
SendKeys.SendWait("BS");
我仔细检查了这个过程是正确的
【问题讨论】:
Does this answer your question? 我已经尝试sendmessage
post message
与火箭联盟和记事本没有成功,我还没有尝试sendinput
但我对此很悲观
【参考方案1】:
所以经过长时间的在线搜索,我找到了一个article,上面有一个切换窗口的示例代码,所以我说见鬼去试试,它确实有效,它在这里切换焦点是 sn-p 希望它有帮助
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
[DllImport("kernel32.dll")]
public static extern uint GetCurrentThreadId();
[DllImport("user32.dll", SetLastError = true)]
public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
[DllImport("user32.dll")]
public static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach);
public static void SwitchWindow(IntPtr windowHandle)
if (GetForegroundWindow() == windowHandle)
return;
IntPtr foregroundWindowHandle = GetForegroundWindow();
uint currentThreadId = GetCurrentThreadId();
uint temp;
uint foregroundThreadId = GetWindowThreadProcessId(foregroundWindowHandle, out temp);
AttachThreadInput(currentThreadId, foregroundThreadId, true);
SetForegroundWindow(windowHandle);
AttachThreadInput(currentThreadId, foregroundThreadId, false);
while (GetForegroundWindow() != windowHandle)
在你获得焦点之后,一个简单的SendKeys.SendWait("<key>")
就像一个魅力
【讨论】:
将Thread.Sleep(10)
之类的内容添加到最终循环中。否则循环时会造成 100% 的 CPU 负载。
此代码已在 .NET Framework 中可用,在每个人最喜欢的实用程序命名空间中,最好按原样使用。 docs.microsoft.com/en-us/dotnet/api/…以上是关于SetForegroundWindow 没有设置焦点的主要内容,如果未能解决你的问题,请参考以下文章
将后台窗口激活到前台的方法(使用AttachThreadInput和SetForegroundWindow两个API)