gpt4 book ai didi

c++ - 设置透明窗口

转载 作者:行者123 更新时间:2023-12-03 07:01:56 25 4
gpt4 key购买 nike

我一直在尝试将 BlueStacks 窗口设置为透明:

DWORD MakeWindowTransparent(HWND hWnd, unsigned char factor)
{
/* First, see if we can get the API call we need. If we've tried
* once, we don't need to try again. */
if (!initialized)
{
HMODULE hDLL = LoadLibrary(L"user32");

pSetLayeredWindowAttributes =
(PSLWA)GetProcAddress(hDLL, "SetLayeredWindowAttributes");

initialized = TRUE;
}

if (pSetLayeredWindowAttributes == NULL)
return FALSE;

/* Windows need to be layered to be made transparent. This is done
* by modifying the extended style bits to contain WS_EX_LAYARED. */
SetLastError(0);

auto winlong = SetWindowLong(hWnd,
GWL_EXSTYLE,
GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);

if ((winlong == 0) && (GetLastError() != 0)) {
auto error = GetLastErrorAsString();
return FALSE;
}

if (!pSetLayeredWindowAttributes(hWnd,RGB(255, 255, 255),factor, LWA_COLORKEY | LWA_ALPHA))
{
auto error = GetLastErrorAsString();
return FALSE;
}

return TRUE;
}


int main() {
HWND hWnd = FindWindowA(NULL, L"BlueStacks");
MakeWindowTransparent(hWnd, 0);
}
BlueStacks可以在 opengldirectx中运行,我已经使用两种模式测试了上面的代码。 MakeWindowTransparent返回0 pSetLayeredWindowAttributes auto error = GetLastErrorAsString();返回的错误是: wrong parameter
我已经使用其他OpenGL窗口测试了代码,并且没有在任何错误中暂停,而且窗口正确透明。
我收集了一些有关窗口的信息:
enter image description here
感谢任何帮助。

最佳答案

为什么同时使用两个标志LWA_COLORKEY | LWA_ALPHA?如果要指定颜色RGB(255, 255, 255),则只需使用LWA_COLORKEY
另外,为什么还要弄乱GetProcAddress呢? SetLayeredWindowAttributes从Windows 2000开始可用;您是否定位的平台早于该平台?
我不熟悉 BlueStacks ,但是SetLayeredWindowAttributes to make a window transparent is only working part of the time表示SetLayeredWindowAttributes不适用于Direct3D;您知道 BlueStacks 是否使用Direct3D吗?
对于OpenGL,请参见:How to make an OpenGL rendering context with transparent background?
更新
我正在使用和BlueStacks的进行游戏,并认为您可以将其重新父化到另一个窗口(不建议这样做,因为您需要处理一些边缘情况)。无论如何,我使用了一个现有的Notepad窗口并能够在其上设置Alpha,这影响了子 BlueStacks 窗口:

int main() {
HWND hWnd = FindWindow(NULL, L"BlueStacks");
HWND hWndN = FindWindow(NULL, L"Untitled - Notepad");
::SetParent(hWnd, hWndN);

auto winlong1 = SetWindowLongPtr(hWnd, GWL_EXSTYLE, 0);
auto winlong2 = SetWindowLongPtr(hWnd, GWL_STYLE, WS_CHILD | WS_VISIBLE);
::SetWindowPos(hWnd, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOZORDER | SWP_NOREDRAW | SWP_NOACTIVATE);

MakeWindowTransparent(hWndN, 200);
}
我还清理了您的函数以摆脱 GetProcAddress:
DWORD MakeWindowTransparent(HWND hWnd, unsigned char factor)
{
auto winlong = SetWindowLong(hWnd,
GWL_EXSTYLE,
GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);

if ((winlong == 0) && (GetLastError() != 0)) {
return FALSE;
}

if (!SetLayeredWindowAttributes(hWnd, 0, factor, LWA_ALPHA))
{
return FALSE;
}

return TRUE;
}
enter image description here

关于c++ - 设置透明窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64975860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com