无法使用FindWindow找到窗口 我一直试图用C++来捕获并复制到剪贴板上的窗口。我已经成功地将代码用于记事本,但奇怪的是,它找不到我尝试过的其他窗口:“计算器”、“写字板”等等

无法使用FindWindow找到窗口 我一直试图用C++来捕获并复制到剪贴板上的窗口。我已经成功地将代码用于记事本,但奇怪的是,它找不到我尝试过的其他窗口:“计算器”、“写字板”等等,c++,winapi,capture,hwnd,C++,Winapi,Capture,Hwnd,代码如下: 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); //cr

代码如下:

    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;
RECT-rc;
HWND HWND=::FindWindow(文本(“记事本”),NULL//这扇窗户不能打开
if(hwnd==NULL)
{

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

如果你仔细阅读了这个方法的文档,你会发现你是在按窗口的类名搜索窗口。正如你提到的,你可以通过简单地搜索“记事本”来找到记事本,这是预期的,因为窗口类称为记事本。但是,并非所有窗口类都如此简单地命名。例如,计算器窗口类实际上被称为“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;
}
#包括“stdafx.h”
#包括
#包括
int _tmain(int argc,_TCHAR*argv[]
{

std::cout如果找不到精确的名称匹配可能是更好的选择。可能这些其他窗口是使用宽字符串指定的?可能与or.HWND HWND=::FindWindowEx(0,0,“记事本”,0)重复;请注意,这是一种与windows交互的非常脆弱的方式。类名不能保证保持不变。如果需要动态查找窗口,则应按照建议使用
EnumWindows
或类似函数。最好创建一个接口(类似于Spy++)这允许用户选择一个窗口进行屏幕截图。首先,谢谢:)当我输入“CalcFrame”时,它不起作用。另外,我下载了spy++11,得到了google Chrome的“Chrome Legacy window”结果-它也不起作用。用“记事本”检查了两次为了确保我没有意外地破坏了代码,所有的东西仍然工作得很好。我刚刚更新了我的答案,添加了示例代码,正如我解释的那样。