我正试图使用此函数来检索窗口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
的窗口上调用它可能是未定义的。