0

嗨,所以我试图获得应用程序的焦点,我在网上能找到的只是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}");
}

该过程是正确的,我仔细检查了

4

1 回答 1

1

因此,经过长时间的在线搜索,我找到了一篇带有切换窗口示例代码的文章,所以我说见鬼去尝试,它确实有效,它切换焦点这里是片段希望它有所帮助

[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>")作品就像一个魅力

于 2020-07-18T11:36:56.230 回答