c#中的键盘钩子

时间:2010-11-04 06:49:56

标签: c# keyboard-hook

我想开发一个按键转换器,它可以将任何按键转换为我的本地语言。例如,如果用户输入“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字符和输入英文字母

4 个答案:

答案 0 :(得分:1)

  

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

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

SendKeys.Send("খ");

如果您想使用Unicode代码发送字符,那么

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

2)如何确保只有unicode   字符被发送给其他人   应用

如果代码在 KeyDown 事件函数中,您可以通过在 SendKeys.Send()语句之后使用以下来禁止输入实际键:

e.Handled == true;

答案 1 :(得分:0)

AFAIK,挂钩用于监控,因此不确定它是否正确用于您正在尝试的操作。但是在你的代码中,也许你可以跳过调用下一个钩子“CallNextHookEx”,这可能会吞下键入的键。请注意,您应该有条件地吞咽,否则您可能会阻止ALT和CTL等按键。

答案 2 :(得分:0)

我不太确定,但如果您不调用CallNextHookEx但是返回空指针,我认为您可以中断链。但是这通常是你不应该做的事情;)

最诚挚的问候,
Oliver Hanappi

答案 3 :(得分:0)

  1. 跳过调用CallNextHookEx以防止特定键事件传播。

  2. Re:使用SendKeys输入Unicode输入:“如果您的应用程序适用于各种键盘的国际使用,使用Send可能会产生不可预测的结果,应该避免使用。” - MSDN基本上我认为SendKeys并不明确支持发送Unicode输入。

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