我在窗口的回调函数中覆盖了窗口的非客户区域,如下所示:
case WM_NCPAINT:
{
HDC hdc;
RECT rect;
HPEN pen;
hdc=GetDCEx(hWnd,(HRGN)wParam,DCX_WINDOW|DCX_CACHE|DCX_INTERSECTRGN|DCX_LOCKWINDOWUPDATE);
GetWindowRect(hWnd,&rect);
pen=CreatePen(PS_SOLID, 10, RGB(255, 0, 0));//red pen 10 pixels in size
SelectObject(hdc,pen);
Rectangle(hdc,0,0,(rect.right-rect.left),(rect.bottom-rect.top));
DeleteObject(pen);
ReleaseDC(hWnd,hdc);
RedrawWindow(hWnd,&rect,(HRGN)wParam,RDW_UPDATENOW)
}break;
Run Code Online (Sandbox Code Playgroud)
这样就可以了,在上面的例子中,我的窗口周围画了一个红色矩形.但是,如果窗口失去焦点,则会绘制默认的非客户区域,并且我的自定义非客户区域图形将消失.
我已经尝试在我的窗口的回调函数中捕获消息WM_KILLFOCUS并使用它与WM_NCPAINT一样,但它没有做任何事情(虽然我看到当我按下另一个窗口并且我的窗口失去焦点时收到此消息) .
我在这里想念的是什么......?
我想在窗口周围画一个矩形,但我不想覆盖标题栏.到目前为止我在窗口回调函数中写的是:
case WM_NCPAINT:
{
HDC hdc;
RECT rect;
HPEN pen;
hdc=GetDCEx(hWnd,(HRGN)wParam,DCX_WINDOW|DCX_CACHE|DCX_INTERSECTRGN|DCX_LOCKWINDOWUPDATE);
GetWindowRect(hWnd,&rect);
pen=CreatePen(PS_SOLID, 10, RGB(255, 0, 0));//red pen 10 pixels in size
SelectObject(hdc,pen);
Rectangle(hdc,0,0,(rect.right-rect.left),(rect.bottom-rect.top));
DeleteObject(pen);
ReleaseDC(hWnd,hdc);
}
break;
Run Code Online (Sandbox Code Playgroud)
但是,这会使用白色画笔绘制窗口标题栏.
如何让它不要在标题栏上画画?我正在丢失标题栏文字和菜单......
我在创建笔之前尝试使用HOLLOW_BRUSH,如下所示:
HBRUSH b=CreateSolidBrush(HOLLOW_BRUSH);
SelectObject(hdc,b);
Run Code Online (Sandbox Code Playgroud)
但这只会导致标题栏根本不被绘制(黑色).
我想捕获桌面并排除被捕获的应用程序的窗口。
我的窗口创建如下:
m_hWnd = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_LAYERED,
g_lpszClassName, NULL, WS_THICKFRAME,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL,
_WPModule.GetHInstance(), NULL);
Run Code Online (Sandbox Code Playgroud)
我捕获屏幕如下:
HWND hWndCapture = ::GetDesktopWindow();
HDC hdcScreen = ::GetDC(hWndCapture);
HDC hdcMem = ::CreateCompatibleDC(hdcScreen);
::BitBlt(
hdcMem,
0,
0,
Width, //width of region of interest
Height, //height of region of interest
hdcScreen,
X, //left staring point for capture
Y, //top staring point for capture
SRCCOPY);
Run Code Online (Sandbox Code Playgroud)
我找到了以下链接从屏幕捕获中排除某些窗口,但它没有提供适用于 IE 8 及更高版本的解决方案。我没有找到针对此问题发布的任何其他解决方案。