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

最佳答案

*强文本*尝试将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);

}

09-28 08:44