我是winapi的新手。我已经看到一个示例来捕获桌面,不包括codeproject
处的某些窗口创建一个子窗口并将其捕获。
hwndMag = CreateWindow(WC_MAGNIFIER, TEXT("MagnifierWindow"),
WS_CHILD | MS_SHOWMAGNIFIEDCURSOR | WS_VISIBLE,
0, 0, m_ScreenX, m_ScreenY,
hostDlg->GetSafeHwnd(), NULL, hInstance, NULL );
我想创建一个父窗口,而不是创建一个子窗口。
我尝试过这段代码。
hwndMag = CreateWindow(WC_MAGNIFIER, TEXT("MagnifierWindow"),
MS_SHOWMAGNIFIEDCURSOR | WS_VISIBLE,
0, 0, m_ScreenX, m_ScreenY,
NULL , NULL, hInstance, NULL );
黑屏可见新窗口。即使我单击捕获按钮,窗口也会被卡住。
为什么会发生这种情况?如何使用新的父窗口进行操作?
由于
答案 0 :(得分:2)
放大镜窗口应该是子窗口。因此它需要一个主父窗口。 example code on MSDN显示了如何执行此操作:
BOOL CreateMagnifier(HINSTANCE hInstance)
{
// Register the host window class.
WNDCLASSEX wcex = {};
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = 0;
wcex.lpfnWndProc = HostWndProc;
wcex.hInstance = hInstance;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
wcex.lpszClassName = WindowClassName;
if (RegisterClassEx(&wcex) == 0)
return FALSE;
// Create the host window.
hwndHost = CreateWindowEx(WS_EX_TOPMOST | WS_EX_LAYERED | WS_EX_TRANSPARENT,
WindowClassName, WindowTitle,
WS_CLIPCHILDREN,
0, 0, 0, 0,
NULL, NULL, hInstance, NULL);
if (!hwndHost)
{
return FALSE;
}
// Make the window opaque.
SetLayeredWindowAttributes(hwndHost, 0, 255, LWA_ALPHA);
// Create a magnifier control that fills the client area.
hwndMag = CreateWindow(WC_MAGNIFIER, TEXT("MagnifierWindow"),
WS_CHILD | MS_SHOWMAGNIFIEDCURSOR | WS_VISIBLE,
0, 0,
LENS_WIDTH,
LENS_HEIGHT,
hwndHost, NULL, hInstance, NULL );
if (!hwndMag)
{
return FALSE;
}
return TRUE;
}
同样的文件也说:
放大镜控件必须托管在使用WS_EX_LAYERED扩展样式创建的窗口中。创建主机窗口后,调用SetLayeredWindowAttributes以设置主机窗口的不透明度。主机窗口通常设置为完全不透明度,以防止显示底层屏幕内容。以下示例显示如何将主机窗口设置为完全不透明度:
SetLayeredWindowAttributes(hwndHost, NULL, 255, LWA_ALPHA);
如果将WS_EX_TRANSPARENT样式应用于主机窗口,则鼠标单击将传递到鼠标光标所在位置的主机窗口后面的任何对象。请注意,由于主机窗口不处理鼠标单击,因此用户将无法使用鼠标移动或调整放大窗口的大小。
上面的MSDN示例说明了这一点。您链接到的CodeProject文章也遵守这些规则。你必须这样做。
答案 1 :(得分:-1)
如果感兴趣的话,我创建了一个示例应用程序,该应用程序使用放大镜API,后来称为" Windows 7 UI自动化客户端API C#样本(焦点跟踪)",可在https://code.msdn.microsoft.com/Windows-7-UI-Automation-6390614a。应用程序跟踪键盘焦点的位置,然后在放大窗口中显示焦点元素(并使用放大API反转颜色)。这是一个C#应用程序,因此它使用互操作来访问放大API。
结果的屏幕截图如下所示。
谢谢,
盖