【问题标题】:Why is my capture window code not working?为什么我的捕获窗口代码不起作用?
【发布时间】:2015-07-28 06:00:22
【问题描述】:

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

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

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

谢谢

【问题讨论】:

    标签: winapi magnification-api


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      结果截图如下。

      谢谢,

      男人

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-23
        • 2013-08-06
        • 1970-01-01
        • 2015-12-21
        • 2016-01-23
        • 2011-05-31
        • 1970-01-01
        相关资源
        最近更新 更多