我有一個程序有幾個自定義控件。其中一個自定義控件是文本輸入控件。由於窗口在點擊時並不自動接收鍵盤焦點,因此我在程序中創建了一個鼠標鉤子,用戶在該窗口中單擊時在窗口上調用SetFocus()。但是,有一個問題。SetFocus()失敗並顯示有效的窗口句柄
如果另一個程序在您點擊我的程序窗口(或該窗口中的任何控件)時有焦點,則SetFocus()失敗。然後我必須再次點擊才能成功。下面的代碼:
LRESULT CALLBACK kbfProc(int nCode, WPARAM wParam, LPARAM lParam) // Keyboard focus switching procedure
{
switch(nCode)
{
case HC_ACTION:
{
if(wParam == WM_LBUTTONDOWN || wParam == WM_NCLBUTTONDOWN)
{
MOUSEHOOKSTRUCT * mhs = (MOUSEHOOKSTRUCT*) lParam;
if(SetFocus(mhs->hwnd) == NULL)
{
printf("SetFocus(Hwnd = %.8x) failed. Error code: %lu\n", mhs->hwnd, GetLastError());
} else {
printf("SetFocus(Hwnd = %.8x) returned success.\n", mhs->hwnd);
}
}
}
break;
}
return CallNextHookEx(0, nCode, wParam, lParam);
}
而那些printf的調用的輸出是這樣的:
SetFocus(Hwnd = 00410c06) failed. Error code: 87
SetFocus(Hwnd = 00410c06) returned success.
SetFocus(Hwnd = 01740fc8) failed. Error code: 87
SetFocus(Hwnd = 01740fc8) returned success.
錯誤代碼87是ERROR_INVALID_PARAMETER,但我顯然通過一個有效的窗口句柄功能,那麼爲什麼它失敗了嗎?
您的kbfProc回調方法是假定每當鼠標移動時調用?向我們展示對WINAPI方法的調用。 此外,我認爲最好通過表單加載事件來設置焦點。 – 2012-03-10 04:00:00
@opatachibueze WINAPI方法?表單加載事件?這不是來自.NET嗎?我正在使用C++ ... – Gogeta70 2012-03-10 04:04:26
你的代碼使用什麼部分LRESULT CALLBACK kbfproc – 2012-03-10 04:10:16