zoukankan      html  css  js  c++  java
  • 利用 AttachThreadInput 改变其它进程的输入法状态

    利用 AttachThreadInput 和 WM_INPUTLANGCHANGEREQUEST 消息 改变 其它 进程 的 输入 状态 ? 众所周知,通过 ActivateKeyboardLayout 函数可以 改变 当前线程的 输入 法 状态 ,不过最近发现通过 AttachThreadInput 和 WM_INPUTLANGCHANGEREQUEST 连用可以

    利用 AttachThreadInput 和 WM_INPUTLANGCHANGEREQUEST 消息改变其它进程输入状态

    ?

    众所周知,通过 ActivateKeyboardLayout 函数可以改变当前线程的输入状态,不过最近发现通过 AttachThreadInput 和 WM_INPUTLANGCHANGEREQUEST 连用可以改变任意进程内线程的输入状态,代码如下:

    ?

    以下代码通过 GetKeyboardLayoutList 取得首选的中文输入法的 HKL(Keybroad Layout Handle):

    ?

    HKL g_hklRPC = NULL;
    
    BOOL InitHklRPC()
    {
        // Find RPC hkl
        UINT nMaxHklCnt = GetKeyboardLayoutList(0, NULL);
    
        HKL* p_hklList = (HKL*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nMaxHklCnt * sizeof(HKL));
    
        UINT nHklCnt = GetKeyboardLayoutList(nMaxHklCnt, p_hklList);
    
        for(UINT i=0;i<nHklCnt;i++) {
            if(LOWORD(p_hklList[i]) == 0x0804) {
                g_hklRPC = p_hklList[i];
                break;
            }
        }
    
        HeapFree(GetProcessHeap(), NULL, p_hklList);
    
        return (g_hklRPC == NULL)? FALSE : TRUE;
    }

    ?

    有关 HKL 参见 MSDN“Languages, Locales, and Keyboard Layouts”,HKL 其实是一个混合值,Loword 是一个 Language IDentifier,Hiword 是一个 Device Handle。以上代码只是简单的通过检查HKL的低字是否为中文 RPC(0x804),并取回第一个中文 RPC 的 HKL。

    ?

    有了 HKL,有趣的节目开始了~~~? 注意,以下代码把当前 focus 所在窗口的输入状态设为中文:

    ?

    HWND hWnd = GetForegroundWindow();
    ASSERT(IsWindow(hWnd))
    
    // Get Target Thread ID and Attach Thread Input
    DWORD ProcID;
    DWORD ThreadID = GetWindowThreadProcessId(hWnd, &ProcID);
    AttachThreadInput(GetCurrentThreadId(), ThreadID, TRUE);
    
    // Get Target Window
    HWND hWndFocus = GetFocus();
    
    // Post Input Messages 
    ASSERT(IsWindow(hWndFocus));
    
    // Change Input Language
    PostMessage(hWndFocus, WM_INPUTLANGCHANGEREQUEST, (WPARAM)TRUE, (LPARAM)g_hklRPC);   // Use Language ID 0x0804(Chinese PRC)
    
    // Detach Thread Input
    AttachThreadInput(GetCurrentThreadId(), ThreadID, FALSE);

    ?

    以上代码十分清晰,我就不解说了。

  • 相关阅读:
    水晶报表显示到aspx页面中
    Python 2.7获取网站源代码的几种方式_20160924
    Seal Report_20160923
    MySQL交叉表处理_20160923
    MySQL日期处理函数_20160922
    MySQL文本处理函数2_20160921
    kettle及数据库导数_20160920
    MySQL常用的数据类型及函数_20160920
    MySQL记录_20160919
    [vuex]
  • 原文地址:https://www.cnblogs.com/babietongtianta/p/6750062.html
Copyright © 2011-2022 走看看