利用 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • matlab之simulink仿真入门

    matlab之simulink仿真入门MatlabSimulink仿真工具的应用****Simulink是一个用来对动态系统进行建模、仿真和分析的软件包。使用Simulink来建模、分析和仿真各种动态系统(包括连续系统、离散系统和混合系统),将是一件非常轻松的事情。它提供了一种图形化的交互环境,只需用鼠标拖动的方法便能迅速地建立起系统框图模型,甚至不需要编写一行代码。由于Simulink具有强大的功能与友好的用户界面,因此它已

    2022年6月4日
    32
  • Java设计模式(三)之创建型模式:单例模式

    Java设计模式(三)之创建型模式:单例模式

    2021年4月9日
    148
  • 最长递增子序列(LIS)[通俗易懂]

    最长递增子序列(LIS)[通俗易懂]①dp[i]表示以i为结尾的最长子序列长度②dp[i]表示长度为i的最长递增子序列末尾的数

    2022年4月27日
    52
  • lldp协议代码阅读_LLDP(lldp协议平时开启还是关闭)

    lldp协议代码阅读_LLDP(lldp协议平时开启还是关闭)没设备,没法试试ndp,不知道disndp是什么效果,和dislldp。有什么区别呢。NDP是邻居发现协议,他也是通过HELLO包机制发现邻居,DISNDP可以看到和它互联的同品牌设备的基本信息以及互联端口。你好!应该是LLDPE产品吧,是线性低密度聚乙烯,主要用来做滚塑产品的我的回答你还满意吗~~不兼容,lldp是lldp,cdp是cdp,现在cisco的设备一般都能支持lldp,lld…

    2022年6月2日
    130
  • BigDecimal类的简单使用方法

    BigDecimal类的简单使用方法

    2021年12月14日
    47
  • 常见Android面试题及答案(详细整理)

    常见Android面试题及答案(详细整理)以下是一些常用的Android面试题及答案,有需要没需要都可以备着,希望能帮到大家。 1.请描述一下Activity生命周期。答:如下图所示。共有七个周期函数,按顺序分别是:onCreate(),onStart(),onRestart(),onResume(),onPause(),onStop(),onDestroy()。onCreate():创建Activit…

    2022年5月21日
    58

发表回复

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

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