gpt4 book ai didi

c++ - SetFocus() 因有效的窗口句柄而失败

转载 作者:太空狗 更新时间:2023-10-29 21:05:36 28 4
gpt4 key购买 nike

我有一个包含多个自定义控件的程序。这些自定义控件之一是文本输入控件。由于单击窗口时窗口不会自动接收键盘焦点,因此我在我的程序中创建了一个鼠标 Hook ,当用户单击该窗口时,它会在该窗口上调用 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,但我显然将有效的窗口句柄传递给该函数,那么为什么会失败?

最佳答案

无论何时调用 SetFocus,窗口都必须附加到调用线程的消息队列,否则 SetFocus 将返回无效。要解决此问题,请使用 SetForegroundWindow首先是当鼠标移到您的窗口上时,然后再调用 SetFocus

关于c++ - SetFocus() 因有效的窗口句柄而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9643536/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com