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 没有设置焦点的主要内容,如果未能解决你的问题,请参考以下文章

SetForegroundWindow 没有激活我的窗口

使用 JNA SetForeGroundWindow

将后台窗口激活到前台的方法(使用AttachThreadInput和SetForegroundWindow两个API)

setForegroundWindow 的使用方法有哪些?

SetForegroundWindow 在对话框窗口中使用时不起作用

进阶篇--相机镜头