我正在尝试用C ++构建一个键盘记录器。 我的键盘记录器的一部分是捕捉屏幕 经过大量的搜索,我决定尝试通过构建一个来了解它是如何工作的。
这是我的截屏代码:
HDC hdc = GetDC(NULL); // get the desktop device context
HDC hDest = CreateCompatibleDC(hdc); // create a device context to use yourself
// get the height and width of the screen
int height = GetSystemMetrics(SM_CYVIRTUALSCREEN);
int width = GetSystemMetrics(SM_CXVIRTUALSCREEN);
// create a bitmap
HBITMAP hbDesktop = CreateCompatibleBitmap(hdc, width, height);
// use the previously created device context with the bitmap
SelectObject(hDest, hbDesktop);
// copy from the desktop device context to the bitmap device context
// call this once per 'frame'
BitBlt(hDest, 0, 0, width, height, hdc, 0, 0, SRCCOPY);
/*CImage image; // from this code i tried to understand how to save the bitmap
image.Attach(hbDesktop);
image.Save(pathname, Gdiplus::ImageFormatBMP);*/
CImage image;//this code is what I came up with eventually
image.Attach(hbDesktop);
CHAR buffer[100] = _T("this is a literal string"); // THIS IS WHERE MY PROBLEM STARTS
sprintf(buffer,_T("this is a literal string"), 1);
image.Save(_T(buffer), Gdiplus::ImageFormatBMP);
我试图让程序每次使用不同的名称保存位图文件。
问题是最后一行不起作用,除非我使用_T
符号,当我放_T
时,它不会占用缓冲区并说“标识符”Lbuffer“未定义” 。这是什么意思?我需要在哪里放置这个L标志?为什么?
另外,有没有更好的方法将位图保存到文件而不使用此_T
符号?
我试过看一下,在https://msdn.microsoft.com/en-us/library/dybsewaf.aspx他们说这是关于Unicode的。为什么我需要这个函数的Unicode? p>
答案 0 :(得分:8)
_T()
及其Win32等效值TEXT()
是预处理器宏,如果L
或{{1},则会在输入值前加_UNICODE
分别定义了。
这些宏仅用于字符/字符串文字。你不能将它们与变量一起使用。因此UNICODE
不是有效代码。这就是您收到_T(buffer)
错误的原因(identifer "Lbuffer" not defined
显然已在您的项目中定义。)
如果定义了_UNICODE
/ _UNICODE
,编译器会将UNICODE
和_T("literal")
评估为TEXT("literal")
- 类型的宽字符串文字L"literal"
强>
如果未定义wchar_t[]
/ _UNICODE
,编译器会将UNICODE
和_T("literal")
评估为TEXT("literal")
- 窄字符串文字输入"literal"
。
char[]
不是一个宏,它是CHAR
的 typedef ,并且是无条件的({{1}有一个等效的char
typedef })。
因此,这一行:
WCHAR
评估为:
wchar_t
CHAR buffer[100] = _T("this is a literal string");
如果您想使用// when _UNICODE is defined
char buffer[100] = L"this is a literal string"; // DOES NOT COMPILE!
// You cannot assign/fill a char[] array with wchar_t data!
/ // when _UNICODE is not defined
char buffer[100] = "this is a literal string"; // OK
,则必须使用_T()
/ TEXT()
代替_TCHAR
,以便匹配:
TCHAR
CHAR
/ _TCHAR buffer[100] = _T("this is a literal string");
是_TCHAR
/ TCHAR
- 敏感的预处理器_UNICODE
。定义UNICODE
/ #define
后,他们会解析为_UNICODE
,否则他们会转而UNICODE
:
wchar_t
char
sprint()
仅适用于// when _UNICODE is defined
wchar_t buffer[100] = L"this is a literal string"; // OK
数据。 // when _UNICODE is not defined
char buffer[100] = "this is a literal string"; // OK
版本为char
,wchar_t
/ swprintf()
版本为_TCHAR
:
TCHAR
_stprintf()
char buffer[100];
sprintf(buffer, "this is a literal string", 1); // OK
CImage::Save()
接受wchar_t buffer[100];
swprintf(buffer, L"this is a literal string", 1); // OK
作为输入。 _TCHAR buffer[100];
_stprintf(buffer, _T("this is a literal string"), 1); // OK
是LPCTSTR
的 typedef ,因此在LPCTSTR
定义时解析为const TCHAR*
,否则解析为const wchar_t*
。由于UNICODE
是敏感的,但您的const char*
始终是UNICODE
,如果buffer
,您将无法将char[]
传递给buffer
} 被定义为。您需要使用Save()
代替:
UNICODE