簡體   English   中英

將 lpcs->lpszName 與 WH_CBT 回調中的“OLEChannelWnd”等其他值進行比較時出現問題

[英]Issue when comparing lpcs->lpszName with other value like "OLEChannelWnd" in a WH_CBT callback

下面是我的WH_CBT回調的代碼。 我試圖忽略 Outlook 中超鏈接的任何點擊。 當我單擊 Outlook 中的超鏈接時,我收到一個消息框:

圖片

但是當我在沒有if條件的回調中返回1時,它工作正常。

LRESULT __declspec(dllexport)__stdcall  CALLBACK GetCBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{

    HRESULT hResult;
    

    if (nCode < 0)
        CallNextHookEx(hkb, nCode, wParam, lParam);

    HWND parentWin;
    DWORD ChiledThreadID;
    DWORD parentProcessID = 0;
    std::ostringstream streamcb;
    DWORD xx = (DWORD)15028;
    HWND hCurrWnd;

    TCHAR  clsName_v[22];
    TCHAR  className[22]="OleMainThreadWndClass";
    LPCSTR oleName2 = _T("OLEChannelWnd");
    int number;
    f1 = fopen("C:\\Log\\report.txt", "a+");
    if (nCode == HCBT_CREATEWND)
    {
        hCurrWnd = (HWND)wParam;
        parentWin = GetAncestor(hCurrWnd, GA_ROOT);
        ChiledThreadID = GetWindowThreadProcessId(parentWin, &parentProcessID);
        if (parentProcessID == xx)
        {
            writetofile("HCBT_CREATEWND", 15, f1);

            CBT_CREATEWNDA* cw = (CBT_CREATEWNDA*)lParam;
            CREATESTRUCTA* lpcs = (CREATESTRUCTA*)cw->lpcs;

            number = GetClassName(hCurrWnd, clsName_v, 22);
            writetofile(clsName_v, number, f1);

            if (lpcs->lpszName)
            {
                if (CompareString(LOCALE_SYSTEM_DEFAULT, 0, lpcs->lpszName, -1, _T("OLEChannelWnd"), 13) == CSTR_EQUAL)
                {
                    return 1;
                }
            }
        }
    }
    fclose(f1);

    LRESULT RetVal = CallNextHookEx(hkb, nCode, wParam, lParam);

    return  RetVal;

}

您的代碼缺少兩個return語句,一個在CallNextHookEx()上,一個在回調結束時。 因此,除非輸入字符串符合您的條件,否則回調的返回值是不確定的。 您的編譯器應該警告您第二次丟失的return 具有非void返回類型的 function 必須以return <value>; 陳述。

試試這個:

LRESULT __declspec(dllexport) CALLBACK GetCBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HCBT_CREATEWND)
    {
        HWND hCurrWnd = (HWND) wParam;
        HWND parentWin = GetAncestor(hCurrWnd, GA_ROOT);
        DWORD parentProcessID = 0;
        DWORD ChildThreadID = GetWindowThreadProcessId(parentWin, &parentProcessID);
        const DWORD xx = 8108;

        if (parentProcessID == xx)
        {
            FILE *f1 = fopen("C:\\Log\\report.txt", "a+");

            writetofile("HCBT_CREATEWND", 14, f1);

            CBT_CREATEWND* cw = (CBT_CREATEWND*) lParam;
            CREATESTRUCT* lpcs = (CREATESTRUCT*) cw->lpcs;

            TCHAR clsName_v[22] = {};
            int number = GetClassName(hCurrWnd, clsName_v, 22);
            writetofile(clsName_v, number, f1);

            fclose(f1);

            if (lpcs->lpszName)
            {
                if (CompareString(LOCALE_SYSTEM_DEFAULT, 0, lpcs->lpszName, -1, _T("OLEChannelWnd"), 13) == CSTR_EQUAL)
                {
                    return 1;
                }
            }
        }
    }

    return CallNextHookEx(hkb, nCode, wParam, lParam);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM