用户 32.DLL 设置焦点失败,并显示 Win32 错误 5:访问被拒绝

本文关键字:错误 Win32 访问 拒绝 显示 DLL 设置 焦点 失败 用户 | 更新日期: 2023-09-27 18:31:42

下面的代码执行以下操作

PushWindowToFront():

  • 获取当前进程 ID 以供以后参考
  • 调用用户32.dll函数 EnumWindows 与回调 EnumWindows回调方法
  • 然后,EnumWindows 遍历每个窗口并为每个窗口调用回调

回调:

  • 检查窗口线程进程 ID 是否与当前进程 ID 相同
  • 如果是这样,请检查窗口文本是否以"选择"开头
  • 如果是这样,请调用 user32.dll函数将焦点设置在窗口句柄上
  • 检查并打印最后一个Win32错误

但是,它始终返回 win32 错误 5 - "访问被拒绝"。为什么应用程序无权针对属于同一进程的窗口调用此函数?

.

    public void PushWindowToFront()
    {
        currentProcessId = System.Diagnostics.Process.GetCurrentProcess().Id;
        Win32Methods.EnumWindowsCallbackDelegate callback = new Win32Methods.EnumWindowsCallbackDelegate(this.EnumWindowsCallback);
        Win32Methods.EnumWindows(callback, (IntPtr) 0);
    }
    public bool EnumWindowsCallback(IntPtr hWnd, IntPtr lParam)
    {
        uint i = 0;
        Win32Methods.GetWindowThreadProcessId(hWnd, out i);
        if (currentProcessId == i)
        {
            StringBuilder sb = new StringBuilder(512);
            Win32Methods.GetWindowText(hWnd, sb, sb.Capacity);
            if (sb.ToString().Split(' ')[0].ToLower().Equals("select"))
            {
                IntPtr result = Win32Methods.SetFocus(hWnd);
                Console.WriteLine("Window found: {0}'r'nSetting focus...'r'nResult: {1}'r'nLastError: {2}",
                    sb.ToString(), result, Marshal.GetLastWin32Error().ToString());
            }
        }
        return true;
    }

用户 32.DLL 设置焦点失败,并显示 Win32 错误 5:访问被拒绝

我收到了确切的情况;我的理解是"SetFocus"是罪魁祸首。我通过将"SetFocus"替换为"SetForegroundWindow"来解决错误

hwnd = win32gui.FindWindow(None, winName)
win32gui.SetForegroundWindow(hwnd)