c++ - 使用 FindWindow 找不到窗口

标签 c++ winapi capture hwnd

<分区>

我一直在尝试使用 C++ 捕获窗口并将其复制到剪贴板。我设法使代码适用于记事本,但奇怪的是它找不到我尝试过的其他窗口:“计算器”、“写字板”等。

这是代码:

    RECT rc;
HWND hwnd = ::FindWindow(TEXT("Notepad"), NULL);    //the window can't be min
if (hwnd == NULL)
{
    cout << "it can't find any 'note' window" << endl;
    getchar();
    return 0;
}
GetClientRect(hwnd, &rc);

//create
HDC hdcScreen = GetDC(NULL);
HDC hdc = CreateCompatibleDC(hdcScreen);
HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen, rc.right - rc.left, rc.bottom - rc.top);
SelectObject(hdc, hbmp);

//Print to memory hdc
PrintWindow(hwnd, hdc, PW_CLIENTONLY);

//copy to clipboard
OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hbmp);
CloseClipboard();

//release
DeleteDC(hdc);
DeleteObject(hbmp);
ReleaseDC(NULL, hdcScreen);

cout << "success copy to clipboard, please paste it to the 'mspaint'" << endl;

提前致谢。

最佳答案

您找不到窗口的最可能原因仅仅是您使用了错误的名称。

如果您阅读了 ::FindWindow 的文档方法,您将意识到您正在按类名搜索窗口。正如您提到的,您可以通过简单地搜索“记事本”找到记事本,这是预期的,因为窗口类称为记事本。然而,并不是所有的窗口类都被如此简单地命名。例如,计算器窗口类实际上称为“CalcFrame”类。

找到要搜索的正确名称的最佳方法是使用名为“Spy++”的工具并使用它的查找功能。此工具通常作为 visual studio 安装的一部分提供。让我知道这是否有帮助。

这是一个示例代码,可以完美运行。

#include "stdafx.h"

#include <iostream>
#include <windows.h>

int _tmain(int argc, _TCHAR* argv[])
{

    std::cout << "This is amazing..."<< std::endl;

    HWND hwnd = ::FindWindow( TEXT("CalcFrame"), NULL );

    if (hwnd != NULL)
    {
        std::cout << "Found." << std::endl;
    }
    else
    {
        std::cout << "Not found." << std::endl;
    }

    return 0;
}

关于c++ - 使用 FindWindow 找不到窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35367085/

相关文章:

c++ - OpenCv:如何将 Mat::Rect 保存到文件中?

c++ - 无法在 lambda 中捕获静态变量

c++ - 如何正确 Hook WM_COMMAND

c++ - 使用 RegisterClassEx 的问题

c# - 我需要查看哪些 API 来编写我自己的 Windows 驱动器号

selenium - Xvfb、Jenkins、Selenium 测试 - 捕获所有页面的屏幕截图

Java在Windows中访问 "Video Controller"

c++ - 简洁地重写一组参数数量可变的函数

c++ - "delete"是否与多态性一起正常工作?

c++ - 为什么使用指针 vector 被认为是不好的?