C++ C++;GetDC所有监视器
基本上,我正在做一些模拟屏幕融化效果的东西,但我只能让它在我的主显示器上工作。我已经尽可能多地查找了,GetDC上只有一个供所有监视器使用的论坛,但它没有用,它所做的只是从我的主监视器到我的辅助监视器制作一个矩形,效果仍然只能在我的主监视器上工作。这是我读到的线索: 我更改的行是C++ C++;GetDC所有监视器,c++,visual-studio,visual-c++,multiple-monitors,C++,Visual Studio,Visual C++,Multiple Monitors,基本上,我正在做一些模拟屏幕融化效果的东西,但我只能让它在我的主显示器上工作。我已经尽可能多地查找了,GetDC上只有一个供所有监视器使用的论坛,但它没有用,它所做的只是从我的主监视器到我的辅助监视器制作一个矩形,效果仍然只能在我的主监视器上工作。这是我读到的线索: 我更改的行是HDC Window=GetDC(Window)到HDC Window=GetDC(NULL),然后是其他一些东西,比如RECT。如果有人能帮我就太好了,谢谢:) PS,屏幕宽度=3600,屏幕高度=1080,而PMSc
HDC Window=GetDC(Window)到HDC Window=GetDC(NULL)
,然后是其他一些东西,比如RECT
。如果有人能帮我就太好了,谢谢:)
PS,屏幕宽度=3600,屏幕高度=1080,而PMScreenWidth=1920,PMScreenHeight=1080。PM和主监视器一样,所以我将该函数中的所有内容设置为ScreenWidth/ScreenHeight,所以它是所有监视器的宽度/高度。但仍然不起作用。GetDC(HWND_桌面)
(与GetDC(0)
)已返回所有监视器的DC。上述代码的问题主要是使用BitBlt
和选择坐标。请参阅下面解决该问题的MCVE
不要根据WM_CREATE
进行绘制,它只会在WM_PAINT
中被擦除,或者在背景被擦除时被擦除
不要调用WM\u PAINT
来响应WM\u PAINT
。如果要删除窗口,只需使用FillRect
,或从命令或其他路径强制重新绘制即可
使用GetSystemMetrics(SM\u CXVIRTUALSCREEN)
和GetSystemMetrics(SM\u CYVIRTUALSCREEN)
返回虚拟监视器的宽度和高度
还应确保该流程了解DPI。对于测试,可以调用SetProcessDPIAware()程式开始时的程式码>。理想情况下,应该在清单文件中设置DPI感知
上面的代码是从同一个客户机DC复制位,它不会做任何事情。您可能希望从桌面DC复制到客户端DC
此外,坐标基本上是随机选取的。它假定主监视器位于左上角。如果uX
大于窗口自身的宽度,则不会复制它,除非窗口拉伸整个虚拟监视器
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);
}
GetDC(HWND\u桌面)
(与GetDC(0)
相同)已返回所有监视器的DC。上述代码的问题主要是使用BitBlt
和选择坐标。请参阅下面解决该问题的MCVE
不要根据WM_CREATE
进行绘制,它只会在WM_PAINT
中被擦除,或者在背景被擦除时被擦除
不要调用WM\u PAINT
来响应WM\u PAINT
。如果要删除窗口,只需使用FillRect
,或从命令或其他路径强制重新绘制即可
使用GetSystemMetrics(SM\u CXVIRTUALSCREEN)
和GetSystemMetrics(SM\u CYVIRTUALSCREEN)
返回虚拟监视器的宽度和高度
还应确保该流程了解DPI。对于测试,可以调用SetProcessDPIAware()程式开始时的程式码>。理想情况下,应该在清单文件中设置DPI感知
上面的代码是从同一个客户机DC复制位,它不会做任何事情。您可能希望从桌面DC复制到客户端DC
此外,坐标基本上是随机选取的。它假定主监视器位于左上角。如果uX
大于窗口自身的宽度,则不会复制它,除非窗口拉伸整个虚拟监视器
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);
}
你可以用
HDC dc=CreateDC((“显示”),NULL,NULL,NULL;
查看以下链接:
你可以用
HDC dc=CreateDC((“显示”),NULL,NULL,NULL;
查看以下链接:
你试过了吗?你试过了吗?谢谢你的建议,但是在第二台显示器上它似乎仍然没有任何作用,即使ScreemWidth是主显示器+第二台显示器。我还会继续看一些文档,看看是否能找到有用的东西。顺便说一下,你的代码与你的问题无关。请参阅有关如何创建以解决特定问题的帮助页面。不要提前开始编写一堆代码。请参阅编辑。感谢您的建议,但即使ScreemWidth是主监视器+辅助监视器,它在第二个监视器上似乎仍然没有任何作用。我还会继续看一些文档,看看是否能找到有用的东西。顺便说一下,你的代码与你的问题无关。请参阅有关如何创建以解决特定问题的帮助页面。不要提前开始编写一堆代码。请参见编辑。
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);
}