1

我是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 ); 

一个带有黑屏的新窗口可见。即使我单击捕获按钮,窗口也会卡住。

为什么会发生这种情况以及如何使用新的父窗口使其工作?

谢谢

4

2 回答 2

2

放大镜窗口应该是一个子窗口。因此它需要一个宿主父窗口。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 文章也遵守这些规则。你也必须这样做。

于 2015-07-28T06:19:38.050 回答
-1

如果感兴趣,我创建了一个使用放大 API 的示例应用程序,不久前称为“Windows 7 UI 自动化客户端 API C# 示例(焦点跟踪)”,可在https://code.msdn.microsoft.com/Windows -7-UI-Automation-6390614a。该应用程序跟踪键盘焦点的位置,然后在放大窗口中显示具有焦点的元素(并使用放大 API 反转颜色)。这是一个 C# 应用程序,因此它使用互操作来访问放大 API。

结果的屏幕截图如下所示。

谢谢,

盖伊

在此处输入图像描述

于 2015-08-13T13:58:33.307 回答