如何获得窗口透明度



我正试图使用此函数来检索窗口alpha值,GetLastError有时说'Access is denied',有时说The parameter is incorrect,在这两种情况下,alpha都是204

正在检查其透明度的窗口是以管理员身份运行的not,我也尝试以管理员身份使用calling功能运行进程,但我仍然收到了同样的错误。

可能发生了什么?

std::string GetLastErrorAsString(DWORD err) {
if (err == 0)
return std::string(); //No error message has been recorded
LPSTR messageBuffer = nullptr;
size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL);
std::string message(messageBuffer, size);
LocalFree(messageBuffer);

return message;
}

DWORD GetWindowAlpha(HWND hWnd) 
{
COLORREF color;
BYTE alpha;
DWORD flags;
GetLayeredWindowAttributes(hWnd, &color, &alpha, &flags);
GetLastErrorAsString(GetLastError());
return DWORD(alpha);
}

该函数位于dll的内部,并检查不同进程的窗口alpha。

SetLayeredWindowAttributes并不是使窗口透明的唯一方法。MSDN在GetLayeredWindowAttributes文档的底部有一条注释:

只有应用程序以前在窗口上调用过SetLayeredWindowAttributes,才能调用

GetLayeredWindowAttributes。如果使用UpdateLayeredWindow设置分层窗口,则该功能将失败。

在没有WS_EX_LAYERED的窗口上调用它可能是未定义的。

最新更新