`
in355hz
  • 浏览: 229899 次
社区版块
存档分类
最新评论

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

阅读更多

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

 

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

分享到:
评论
2 楼 in355hz 2012-02-01  
检查一下 AttachThreadInput 的返回值? 另外确认一下 ThreadID 和 hWnd 对不对. 我没有在高版本的 IE / Vista / Win7 测试过。
1 楼 chengdu1113 2011-11-16  
你好:
    我正在开发一种npapi的插件,但是在输入框中输入法总是切换不出来。试过你这个方法,好像不行。这是为什么,能给个提示吗?

相关推荐

    VC截获输入法状态,候选词条

    当输入法状态改变或候选词更新时,系统会发送特定的消息(如WM_INPUTLANGCHANGE,WM_IME_NOTIFY等)到应用程序窗口。 2. **IMM32库**:这是Windows API的一部分,提供了一组接口用于管理输入法。例如,`...

    jquery 强制设置文本框处于英文输入法状态

    总结来说,面对“jquery 强制设置文本框处于英文输入法状态”的问题,开发人员可以利用jQuery事件处理和JavaScript的特性来控制文本框的输入模式,确保在扫描枪或其他输入设备触发时,系统不会误切换到中文输入法。...

    修复输入法状态条,输入法语言栏,输入法切换

    在日常电脑使用中,输入法是必不可少的工具,它让我们能够用中文或其他语言进行文字输入。然而,有时候输入法状态条、语言栏或输入法切换功能可能会出现问题,导致用户无法正常工作或交流。本文将详细讲解如何修复...

    获取当前的输入法(vc)

    4. **利用COM组件**:Windows还提供了IME COM接口(IActiveIMMIME),通过这个接口可以更方便地操作和查询输入法状态。不过,这需要对COM编程有一定了解。 ```cpp CoInitialize(NULL); // 初始化COM环境 ...

    学习电脑信息极点五笔的输入法状态栏不见了怎么办

    极点五笔输入法状态栏操作指南 极点五笔是一款功能强大且流行的输入法软件,对于中文输入提供了多种功能和快捷键。然而,在使用极点五笔时,输入法状态栏可能会消失不见,影响用户的使用体验。因此,本文将对极点...

    delphi 的输入法编程检测输入法

    在Delphi编程环境中,开发与输入法相关的应用是一项常见的任务,尤其在创建打字比赛软件或其他需要精细控制用户输入的程序时。输入法(IME,Input Method Editor)是操作系统提供的一种服务,允许用户通过非拉丁字符...

    用C#控制当前输入法

    本文将详细解析如何利用C#来实现对当前输入法的控制,使得用户无需手动进行输入法的切换,从而提高用户体验和应用程序的易用性。 ### 知识点一:C#中的输入法控制 在C#中,可以通过调用Windows API或使用.NET ...

    c# windows程序中调用输入法

    C#作为.NET Framework的一部分,可以利用这个接口来实现对输入法的支持。 1. **创建Windows Forms应用程序** 在Visual Studio中,选择"新建项目",然后选择"C# Windows Forms应用程序"模板。这会生成一个名为`...

    输入法进程

    如果你的输入法不能用了,如果你的输入法图标不见了,如果你开机提坏输入法错误了,就下载打开一下就行了

    ImTip 输入法状态跟踪提示工具

    理论上支持所有输入法,系统自带的微软拼音,微软五笔,搜狗输入法,小小输入法,百度输入法,QQ输入法,谷歌输入法,小鹤输入法,手心输入法 …… 包括我测试的日文、韩文、西班牙语输入法都可以支持 ImTip 。...

    利用输入法注入任意DLL演示

    本演示详细介绍了如何利用输入法注入来实现任意DLL的注入,特别是针对那些具有自我保护机制的进程。 首先,我们需要理解什么是DLL(动态链接库)。DLL是Windows操作系统中的一个重要组成部分,它包含可由多个程序...

    利用程序选择输入法

    输入法是指在计算机或其他设备上进行文本输入的方法,对于中文用户来说,常见的输入法有拼音输入法(如搜狗、百度、微软拼音等)、五笔字型输入法、手写输入法等。每种输入法都有其独特的输入方式和特点,用户可以...

    c#如何获取和设置输入法

    设置输入法通常涉及到切换到特定的输入法状态。可以使用`ImmAssociateContext`函数来完成这个任务。该函数接收窗口句柄和输入法上下文句柄作为参数,允许我们指定新的输入法。例如: ```csharp [DllImport("imm32....

    windows输入法切换

    开发者可以通过注册表或者其他配置文件来添加、删除或更改输入法。 3. **API接口**: “InputLanguage.cpp”和“InputLanguage.h”很可能包含了与Windows API交互的代码,尤其是与输入法相关的函数,如`...

    Python-PIME用于利用Python开发Windows的输入法

    这个项目基于Python编程语言,充分利用了Python的灵活性和易用性,使得开发者无需深入理解底层复杂的输入法引擎,就能快速实现自己的输入法功能。 在Windows操作系统中,输入法是用户与计算机进行文字交互的关键...

    通过输入法对进程注入DLL

    在IT领域,进程注入DLL(Dynamic Link Library)是一种高级的技术,通常用于调试、监控或篡改其他应用程序的行为。本文将详细探讨如何通过输入法来实现这一技术,以及它的工作原理和潜在的应用场景。 首先,我们...

    输入法修复工具修复状态条,语言栏,切换

    然而,有时由于系统问题、软件冲突或者病毒攻击,输入法可能会出现各种故障,如状态条消失、语言栏无法显示或切换输入法失效等。这时,我们就需要借助专业的输入法修复工具来解决这些问题。本文将详细介绍输入法修复...

    谷歌输入法框架 IMF

    1. 输入法管理器:输入法管理器是整个框架的核心,它作为客户端API存在于每个应用程序上下文中,并与全局系统服务通信,负责协调所有进程间输入法的交互。它管理着输入法的生命周期,如启动、关闭,以及与客户端应用...

    易语言源码打开与关闭输入法.rar

    设置输入法状态”这样的命令,改变当前的输入法状态。 4. API调用: 虽然易语言提供了很多内置函数,但有时仍需调用操作系统级别的API函数来实现更底层的功能。例如,Windows API中的`ImmGetContext`和`...

    输入法状态跟踪提示工具ImTip_v4.5.7z

    输入法状态跟踪提示工具ImTip_v4.5.7z

Global site tag (gtag.js) - Google Analytics