GetFocus 和 SetFocus 跨线程调用是无效的。
解决方法:
https://blog.csdn.net/ribut9225/article/details/21620139
bool SysControlBase::isFocused()
{
DWORD SelfThreadId = GetCurrentThreadId(); // 获取自身线程 ID
DWORD ForeThreadId = GetWindowThreadProcessId(m_hParent, NULL); // 根据窗口句柄获取线程 ID
AttachThreadInput(ForeThreadId, SelfThreadId, true); // 附加到线程
HWND hWnd = GetFocus(); // 获取具有输入焦点的窗口句柄
AttachThreadInput(ForeThreadId, SelfThreadId, false); // 取消附加到线程
return hWnd == GetHandle();
}
这是判断是否获取到焦点的。设置焦点就不用那么麻烦了,可以这样:
void SysControlBase::SetFocus(bool focused)
{
SendMessage(GetHandle(), focused ? WM_SETFOCUS : WM_KILLFOCUS, 0, 0);
}
以上所给代码都是在 SysControlBase 类中的。所以要替换 GetHandle() 函数为自己的控件句柄,替换 m_hParent 为控件的父窗口句柄。