winapi - 为什么 GetWindowRgn 在 Vista 上失败?

标签 winapi windows-vista

我正在编写一个使用 SetWindowRgn 的程序在属于另一个进程的窗口中制作透明孔。 (只有当用户明确请求时才会这样做。)

程序必须假定目标窗口可能已经有需要保留的孔,因此在调用 SetWindowRgn 之前,它会调用 GetWindowRgn获取当前区域,然后将当前区域与新区域组合并调用 SetWindowRgn:

HRGN rgnOld = CreateRectRgn ( 0, 0, 0, 0 );
int regionType = GetWindowRgn ( hwnd, rgnOld ); 

这在 XP 中工作正常,但对 GetWindowRgn 的调用在 Vista 中失败。我已经尝试关闭 Aero 并使用 AdjustTokenPrivileges 将线程的权限提升到 SE_DEBUG_NAME , 但都没有帮助。

GetLastError() 似乎没有为 GetWindowRgn 返回有效值——它在一台机器上返回 0,在另一台机器上返回 5(访问被拒绝)。

任何人都可以告诉我我做错了什么或建议不同的方法吗?

最佳答案

您确定您的窗口一个区域吗? XP 中的大多数顶级窗口都这样做,只是因为默认主题将它们用于圆角......但这仍然是一个错误的假设,并且一旦你进入 Vista 就很可能不成立。

如果您尚未设置区域,并且调用失败,请使用合理的默认值(窗口矩形),不要让它毁了您的生活。现在,如果 SetWindowRgn() 失败...

关于winapi - 为什么 GetWindowRgn 在 Vista 上失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/144774/

相关文章:

c++ - 由于后台线程上的事件,在 ui 线程上执行方法

c++ - 在非联网计算机之间复制 Visual Studio C++ 项目

C++ win32 api双缓冲示例帮助请

c# - 自定义控制框按钮

.net - 是否有 Windows 窗体 native 方法来闪烁窗体的标题栏?

Delphi - Firebird - Vista 访问套接字被拒绝

Vista 上的 Java File.canWrite() 和 super 隐藏文件

python - 我无法删除刚从 python 中的 zip 文件中提取的文件夹

windows - 在 Windows Vista 上以编程方式注册 .dll(使用 DllRegisterServer)

c - "BUTTON"是普通控件吗?