我一直在尝试使用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;
提前致谢。
答案 0 :(得分:1)
您找不到窗户的最可能原因只是您使用了错误的名称。
如果您阅读了::FindWindow方法的文档,您将意识到您正在按类名搜索Windows。正如您所提到的,您只需搜索“记事本”即可找到记事本,这是预期的,因为窗口类称为记事本。但是,并非所有窗口类都如此简单地命名。例如,Calculator窗口类实际上称为“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;
}