[英]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.