利用 AttachThreadInput 改变其它进程的输入法状态「建议收藏」

利用 AttachThreadInput 改变其它进程的输入法状态「建议收藏」利用AttachThreadInput和WM_INPUTLANGCHANGEREQUEST消息改变其它进程的输入状态?众所周知,通过ActivateKeyboardLayou

大家好,又见面了,我是你们的朋友全栈君。

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

?

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155283.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月2日 下午1:36
下一篇 2022年7月2日 下午1:46


相关推荐

  • 修改DLL文件内容

    修改DLL文件内容今天帮人修改一个网站 asp net 的 遇到一个奇怪的问题 某个页面的 title 总是改不掉 以前遇到这种问题 一般是为了防止盗版 写在某段 js 里的混淆代码 或是发起请求从别的地方获取的 title 所以采用了两种方法调试 文件搜索 title 名 如果写在 js 里肯定可以被搜索到 但是没有 查看页面请求 也没有异常请求 由于刚入门 net 没有意识到可以静态调试 好方便 所以在 cs 文件里又修改了 t

    2026年3月16日
    2
  • java三种注释_java注释的三种形式

    java三种注释_java注释的三种形式JAVA 的注释共有三种形式 单行注释 多行注释 文档注释 1 单行注释 publicclasso publicstatic String args 这是一个单行注释 System out println HelloWorld 2 多行注释 publicclasso publicstatic String

    2026年3月19日
    2
  • Vue.js(一) Vue.js + element-ui 扫盲

    Vue.js(一) Vue.js + element-ui 扫盲一 node js 是什么我们知道 javascript 代码只能在浏览器上运行 只有浏览器能够解析 js 代码 如果想要 javascript 代码能够在服务器端运行就必须提供一个 Javascript 的运行环境 runtimeenvir 这就是 node js node js 是对 ChromeV8 引擎进行了封装 是一个能让 JavaScript 运行在服务端的开发平台 它让 JavaScript 成

    2026年3月16日
    2
  • CSS3-transition「建议收藏」

    CSS3-transition「建议收藏」1、transition代表css3中的过渡,可以使元素从一种样式逐渐改变为另一种的效果。2、transition:height2s;表示需要渐变的是元素高度height,渐变时间是2s。tra

    2022年7月4日
    21
  • Java高级工程师常见面试题(一)-Java基础「建议收藏」

    Java高级工程师常见面试题(一)-Java基础「建议收藏」博主其他相关文章:《Java高级工程师常见面试题-总结》1.String类为什么是final的。多线程安全,将字符串对象保存在字符串常量池中共享效率高2.HashMap的源码,实现原理,底层结构。HashMap基于哈希表的Map接口的实现。允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。值得注意的是HashMap不是线程安全的…

    2022年5月27日
    37
  • CWnd的派生类-3、CDialog类

    CWnd的派生类-3、CDialog类

    2021年8月11日
    72

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号