gpt4 book ai didi

C++ GetDC 所有监视器

转载 作者:行者123 更新时间:2023-11-28 01:27:00 27 4
gpt4 key购买 nike

基本上,我正在制作模仿屏幕融化效果的东西,但我只能让它在我的主显示器上运行。我已经尽可能多地查找了所有显示器的 GetDC 上只有一个论坛,但它没有用,它所做的只是从我的主显示器到我的辅助显示器制作一个矩形,效果仍然只能在我的主显示器。这是我读到的主题:GetDC(NULL) gets primary monitor or virtual screen?

LRESULT CALLBACK Melter(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) {
switch (Message) {
case WM_CREATE: {
HDC Desktop = GetDC(HWND_DESKTOP);
HDC Window = GetDC(hWnd);

BitBlt(Window, 0, 0, ScreenWidth, ScreenHeight, Desktop, 0, 0, SRCCOPY);
ReleaseDC(hWnd, Window);
ReleaseDC(HWND_DESKTOP, Desktop);

SetTimer(hWnd, 0, Interval, 0);
ShowWindow(hWnd, SW_SHOW);

break;
}
case WM_PAINT: {
ValidateRect(hWnd, 0);
break;
}
case WM_TIMER: {
HDC Window = GetDC(hWnd);
int uX = (rand() % ScreenWidth) - (150 / 2), uY = (rand() % 15), Width = (rand() % 150);

BitBlt(Window, uX, uY, Width, ScreenHeight, Window, uX, 0, SRCCOPY);
ReleaseDC(hWnd, Window);

break;
}
case WM_DESTROY: {
KillTimer(hWnd, 0);
PostQuitMessage(EXIT_SUCCESS);
break;
}
return EXIT_SUCCESS;
}

return DefWindowProc(hWnd, Message, wParam, lParam);
}

我更改的行是 HDC Window = GetDC(Window) 到 HDC Window = GetDC(NULL),然后是一些其他内容,例如 RECT。如果有人能帮助我,那就太好了,谢谢:)

PS,ScreenWidth = 3600,ScreenHeight = 1080,而 PMScreenWidth = 1920,PMScreenHeight = 1080。PM 在主监视器中,所以我将该函数中的所有内容都设置为 ScreenWidth/ScreenHeight,所以它的宽度/高度所有显示器。不过还是不行。

最佳答案

GetDC(HWND_DESKTOP)(与 GetDC(0) 相同)已返回所有显示器的 DC。上述代码的问题主要在于 BitBlt 的使用和坐标的选择。请参阅下面解决该问题的 MCVE。

不要响应 WM_CREATE 进行绘制,它只会在 WM_PAINT 中或背景被删除时被删除。

不要调用 ValidateRect 来响应 WM_PAINT。如果您想删除窗口,只需使用 FillRect,或通过命令或其他路径强制重新绘制。

使用 GetSystemMetrics(SM_CXVIRTUALSCREEN)GetSystemMetrics(SM_CYVIRTUALSCREEN) 返回虚拟监视器的宽度和高度。

还要确保进程是 DPI 感知的。为了进行测试,您可以在程序开始时调用 SetProcessDPIAware();。理想情况下,应在 list 文件中设置 DPI 感知。

int uX = (rand() % ScreenWidth) - (150 / 2);
int uY = (rand() % 15);
int Width = (rand() % 150);
BitBlt(Window, uX, uY, Width, ScreenHeight, Window, uX, 0, SRCCOPY);

上面的代码是从同一个客户端 DC 的客户端 DC 复制位,它不会做任何事情。假设您想从桌面 DC 复制到客户端 DC。

而且,坐标基本上是随机选取的。它假定主监视器位于左上角。如果 uX 大于窗口自身的宽度,它将不会被复制,除非窗口拉伸(stretch)整个虚拟监视器。

LRESULT CALLBACK Melter(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) {

switch(Message)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
auto hdc = BeginPaint(hWnd, &ps);
RECT rc;
GetClientRect(hWnd, &rc);

HDC hdesktop = GetDC(0);

int screenx = GetSystemMetrics(SM_XVIRTUALSCREEN);
int screeny = GetSystemMetrics(SM_YVIRTUALSCREEN);
int screenw = GetSystemMetrics(SM_CXVIRTUALSCREEN);
int screenh = GetSystemMetrics(SM_CYVIRTUALSCREEN);

StretchBlt(hdc, 0, 0, rc.right, rc.bottom,
hdesktop, screenx, screeny, screenw, screenh, SRCCOPY);

ReleaseDC(0, hdesktop);

EndPaint(hWnd, &ps);
break;
}

case WM_DESTROY:
PostQuitMessage(0);
break;
}

return DefWindowProc(hWnd, Message, wParam, lParam);
}

关于C++ GetDC 所有监视器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53329673/

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