User32.DLL SetFocus 失败并出现 Win32 错误 5:访问被拒绝
Posted
技术标签:
【中文标题】User32.DLL SetFocus 失败并出现 Win32 错误 5:访问被拒绝【英文标题】:User32.DLL SetFocus fails with Win32 error 5:Access is denied 【发布时间】:2012-05-02 01:00:15 【问题描述】:下面的代码执行以下操作
PushWindowToFront():
获取当前进程 ID 供以后参考 使用回调EnumWindowsCallback方法调用user32.dll函数EnumWindows EnumWindows 然后遍历每个窗口并为每个窗口调用回调回调:
检查窗口线程进程id是否与当前进程id相同 如果是,请检查窗口文本是否以“选择”开头 如果是,则在窗口句柄上调用 user32.dll 函数 SetFocus 检查并打印最后一个 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;
【问题讨论】:
result
的值是多少?
线程也很重要,窗口归创建它的线程所有。
【参考方案1】:
我收到了这个确切的情况;我的理解是“SetFocus”是罪魁祸首。我通过用“SetForegroundWindow”替换“SetFocus”解决了这个错误
hwnd = win32gui.FindWindow(None, winName)
win32gui.SetForegroundWindow(hwnd)
【讨论】:
以上是关于User32.DLL SetFocus 失败并出现 Win32 错误 5:访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章
加载 OpenSSL DLLS 失败。ssleay32.dll 或 libeay32.dll
Unity3d user32.dll 拖动窗口并重新获得焦点
C# PInvoking user32.dll 在 64 位系统上
无法定位序数4684与动态链接库ssleay32.dll上怎么解决