c# 中的键盘钩子

问题描述 投票:0回答:5

我想开发一个击键转换器,它将任何击键转换为我的本地语言。例如,如果用户输入“a”,那么它将被替换为相应的 unicode 字母“\u0995

我使用了类似的代码:https://stackoverflow.com/global-low-level-keyboard-hook-freezing-in-c-net-3-5在那里,我编辑如下:

 // MessageBox.Show("Test"); // I do not want this so commented
 int vkCode = Marshal.ReadInt32(lParam);
 Console.WriteLine((Keys)(vkCode + 2));

 SendKeys.Send("mmm"); // mmm will be my desired unicode character           

现在,我打开任何应用程序并键入任何内容,我都会收到键入的字母和“mmm”。

例如,如果我输入:abcd,那么我得到的输出为:mmmcmmmdmmmemmmf........[输出]


现在我的问题是,

1)我如何编辑此代码以发送 unicode 字母而不是字母? (我的意思是,如果我输入“p”,那么我希望其他应用程序应该接收类似于此 unicode 字符的 unicode 字符:“0996

2) 如何确保仅将 unicode 字符发送到其他应用程序,而不能附加键入的字符。我的意思是,我不想要上面输出中的 unicode 字符和键入的英文字母[输出]

c# keyboard-hook
5个回答
1
投票

1)我如何编辑此代码以发送 unicode 字母而不是字母?

SendKeys.Send() 也可以发送 Unicode 印度字符,例如

SendKeys.Send("খ");

如果你想使用Unicode编码来发送字符,那么

SendKeys.Send('\u0996'.ToString());

2)如何确保只有unicode 字符被发送给其他人 申请?

如果代码位于 KeyDown 事件函数内,您可以在 SendKeys.Send() 语句之后使用以下内容来抑制正在键入的实际键:

e.Handled == true;

0
投票

AFAIK,挂钩是为了监控,所以不确定它是否适合您想要做的事情的正确方法。但在您的代码中,也许您可以跳过调用下一个挂钩“CallNextHookEx”,这可能会吞掉键入的键。请注意,您应该有条件地吞咽,否则您可能会阻塞 ALT 和 CTL 等按键。


0
投票

我不太确定,但我认为如果你不调用

CallNextHookEx
而是返回一个空指针,你可以中断链。但这是你通常不应该做的事情;)

致以诚挚的问候,
奥利弗·哈纳皮


0
投票
  1. 跳过调用

    CallNextHookEx
    以防止传播特定的按键事件。

  2. 回复:使用 SendKeys 输入 Unicode 输入:“如果您的应用程序旨在通过各种键盘进行国际使用,则使用 Send 可能会产生不可预测的结果,应避免使用。” -MSDN基本上我认为SendKeys不明确支持发送Unicode输入。

您是否看过 Microsoft Text Services Framework 而不是您正在尝试的这种方法?我认为它基本上是为了解决您想要做的事情而构建的。


0
投票

您可以使用

SharpHook
库。

SharpHook 提供了跨平台的全局键盘和鼠标钩子 .NET,以及模拟输入事件的能力。这是一个薄薄的包装纸 libuiohook 并提供对其功能的直接访问以及 更高级别的类型来使用它。

© www.soinside.com 2019 - 2024. All rights reserved.