这是我的挂钩程序,当我尝试读取存储在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;
}
答案 0 :(得分:1)
* 强文 *尝试将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);
}