利用 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);
以上代码十分清晰,我就不解说了。
分享到:
相关推荐
用VC6实现的截获输入法状态,,中文输入候选词条信息的代码
修复输入法状态条,输入法语言栏,输入法切换。
场景1:制作火星文输入法外挂,原理是利用API HOOK拦截并修改输入法相关函 数,需要注入一个DLL到所有进程中,但是后来发现,在开启了瑞星的帐号保险箱后,用户 将不能在QQ中输入火星文。原因是瑞星保护了QQ进程,...
如果你的输入法不能用了,如果你的输入法图标不见了,如果你开机提坏输入法错误了,就下载打开一下就行了
理论上支持所有输入法,系统自带的微软拼音,微软五笔,搜狗输入法,小小输入法,百度输入法,QQ输入法,谷歌输入法,小鹤输入法,手心输入法 …… 包括我测试的日文、韩文、西班牙语输入法都可以支持 ImTip 。...
PIME:用于利用Python开发Windows的输入法
delphi 的输入法编程检测输入法,检测当前的输入法的状态,用于对输入法进行控制的软件,例如打字比赛软件
根据不同的输入法设置通知栏为不同的颜色,使输入法状态更加醒目。 通过余光就可以获知当前输入法状态,无需转移眼光焦点。 详细使用说明请阅览《macOS 中英文输入法切换终极解决方案》,链接:...
利用进行加载注册表中的输入法,然后通过下拉菜单进行选择输入法
JS写的输入法JS写的输入法JS写的输入法JS写的输入法JS写的输入法JS写的输入法JS写的输入法 JS写的输入法JS写的输入法JS写的输入法JS写的输入法JS写的输入法JS写的输入法JS写的输入法 JS写的输入法JS写的输入法JS写的...
云手写输入法 4.0 [下载地址] ...云输入法是利用云计算技术的在线输入法,是免安装,可直接使用的输入法。 它是最新的网页输入法与传统输入法结合起来的,只要能上网,就能输入,并大幅提升输入准确率。
输入法状态,也能玩“智能”.docx
手写输入法手写输入法手写输入法手写输入法手写输入法手写输入法手写输入法手写输入法手写输入法手写输入法手写输入法手写输入法手写输入法手写输入法手写输入法
梅花输入法梅花输入法梅花输入法梅花输入法梅花输入法
用C#控制当前输入法,用户不必手工切换输入法。
学习电脑信息极点五笔的输入法状态栏不见了怎么办
利用输入法注入任意DLL演示(可绕过大多数安全软件的检测,能够注入带有自我保护的进程)
风清扬输入法 输入法 风清扬输入法 风清扬输入法
万能输入法万能输入法万能输入法万能输入法
通过输入法对进程注入DLL 废话不多多,识货的人拿