匯東網


GetFocus 和 SetFocus 获取和设置焦点的问题(跨线程调用无效)

[編輯] [转简体]
|
作者:huidong | 分類:【編程】Win32
[ 24 瀏覽 0 評論 11 贊 10 踩 ]

概要

正文

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 为控件的父窗口句柄。

[ 11] [ 10]


 評論區  0 條評論

+ 添加評論