CBT_CREATEWND结构具有无效名称

时间:2013-12-14 12:48:51

标签: c++ windows winapi hook

这是我的挂钩程序,当我尝试读取存储在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;
}

1 个答案:

答案 0 :(得分:1)

* 强文 *尝试将IsWindowUnicodewParam中的窗口句柄一起使用。 如果窗口是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);

}