这是我的上钩过程,每当我尝试读取存储在CBTHOOKCREATE->lpcs->lpszName
中的名称时,都会遇到诸如以下的垃圾值:
79 77A064700 Created!~
0 00F915BC0 Created!~
68 000DF5BC0 Created!~
0 00F915BC0 Created!~
0 00F915BC0 Created!~
67 7630D8200 Created!~
77 000DEF340 Created!~
79 77A064700 Created!~
相同的内容适用于
lpszClass
。关于取消对lparam的引用,我应该做些什么,但还没有完成?
这是有问题的功能:
LRESULT CALLBACK HookProcedure(int nCode, WPARAM wparam, LPARAM lparam)
{
if (nCode < 0) return CallNextHookEx(hookID, nCode, wparam, lparam);
std::ofstream outfile;
CBT_CREATEWND *CBTHOOKCREATE;
RECT *CBTRECTPTR;
RECT CBTRECT;
wstring Message;
CBTHOOKCREATE = (CBT_CREATEWND*) lparam;
LPWSTR str = L" ";
outfile.open(("d:\\test.txt"), std::ios_base::app);
if (nCode >= 0) {
switch (nCode)
{
case HCBT_CREATEWND:
outfile << *(CBTHOOKCREATE->lpcs->lpszName) << " " << CBTHOOKCREATE->lpcs->lpszName << " Created!~ " << endl;
//cout << "Created!~" << endl;
break;
case HCBT_DESTROYWND:
outfile << "Destroied!~" << endl;
//cout << "Destroied!~" << endl;
break;
default:
//cout << "sth else" << endl;
break;
}
}
outfile.close();
return 0;
}
最佳答案
*强文本*尝试将IsWindowUnicode与wParam
中的窗口句柄一起使用。
如果窗口是Unicode,则lpcs
指向CREATESTRUCTW
结构,而lpszName
指向宽字符串,则必须进行转换。
将以下代码添加到DLL CPP文件的顶部。
std::string wc2s( const wchar_t * pw ) {
int length = (int)wcslen( pw ) + 1;
int newlen = WideCharToMultiByte( CP_ACP, 0, pw, length, 0, 0, 0, 0 );
std::string r( newlen , '\0' );
WideCharToMultiByte( CP_ACP, 0, pw, length, &r[0], newlen, 0, 0 );
return r;
}
对传递给CreateWindow的文本使用以下代码
case HCBT_CREATEWND: {
CBT_CREATEWND * pCBT_CW = (CBT_CREATEWND *)lParam;
std::string strCreatText;
if ( pCBT_CW->lpcs->lpszName != NULL ) {
if ( IsWindowUnicode( (HWND)wParam ) ) {
strCreatText = wc2s( pCBT_CW->lpcs->lpszName );
} else {
strCreatText = (char*)pCBT_CW->lpcs->lpszName;
}
}
outfile << strCreatText << " Created!~ " << endl;
break;
}
PS:未经测试
更新:根据IInspectable注释。非侵入式CBT_HOOK必须遵循钩子的一般规则:返回CallNextHookEx返回的内容。
LRESULT CALLBACK HookProcedure(int nCode, [...]
if ( nCode >= 0 ) {
[...]
}
return CallNextHookEx(NULL, nCode, wparam, lparam);
}