利用 AttachThreadInput 改变其它进程的输入法状态

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

利用 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);

 

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

目录
相关文章
|
7月前
|
安全 Linux API
操作系统中的窗口焦点和事件的影响
操作系统中的窗口焦点和事件的影响
116 0
|
机器学习/深度学习 传感器 缓存
微软正常状态和黑屏状态 的进程占用top区别
微软正常状态和黑屏状态 的进程占用top区别
|
弹性计算 监控 大数据
集群状态显示,进程存在,但是组件状态显示未知
集群状态显示,进程存在,但是组件状态显示未知
|
物联网 Linux 调度
进程的状态及切换|学习笔记
快速学习进程的状态及切换
进程的状态及切换|学习笔记
|
Android开发
Android软键盘状态的切换及其强制隐藏
MainActivity如下:package cc.c; import android.os.Bundle; import android.view.
853 0
QT软件开发: 打开的窗口默认处于屏幕中间
QT软件开发: 打开的窗口默认处于屏幕中间
257 0
QT软件开发: 打开的窗口默认处于屏幕中间
|
Windows
windows 技巧篇-快捷键占用导致不能输入字母文字解决方法,解除快捷键锁死、卡死方法
windows 技巧篇-快捷键占用导致不能输入字母文字解决方法,解除快捷键锁死、卡死方法
683 0
windows 技巧篇-快捷键占用导致不能输入字母文字解决方法,解除快捷键锁死、卡死方法
|
C# Windows
C# 程序关闭托盘图标不会自动消失
原文:C# 程序关闭托盘图标不会自动消失 c#程序关闭托盘图标不会自动消失,进程的托盘图标却不能随着进程的结束而自动消失  必须将鼠标移到图标上面时才能消失?  请问如何才能做到图标随着进程的结束而自动消失呢(外部强行结束,如在任务管理器将其结束), windows系统好多程序都会这样。
1286 0
|
C#
C# 通过进程名/进程Id 操作窗口/程序
原文:C# 通过进程名/进程Id 操作窗口/程序 1. 判断窗口是否存在 1 private bool IsWindowExist(IntPtr handle) 2 { 3 return (!(GetWindow(new HandleRef(this, handle), 4) != IntPtr.
1485 0