我想开发一个击键转换器,它将任何击键转换为我的本地语言。例如,如果用户输入“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 字符和键入的英文字母[输出]
1)我如何编辑此代码以发送 unicode 字母而不是字母?
SendKeys.Send() 也可以发送 Unicode 印度字符,例如
SendKeys.Send("খ");
如果你想使用Unicode编码来发送字符,那么
SendKeys.Send('\u0996'.ToString());
2)如何确保只有unicode 字符被发送给其他人 申请?
如果代码位于 KeyDown 事件函数内,您可以在 SendKeys.Send() 语句之后使用以下内容来抑制正在键入的实际键:
e.Handled == true;
AFAIK,挂钩是为了监控,所以不确定它是否适合您想要做的事情的正确方法。但在您的代码中,也许您可以跳过调用下一个挂钩“CallNextHookEx”,这可能会吞掉键入的键。请注意,您应该有条件地吞咽,否则您可能会阻塞 ALT 和 CTL 等按键。
我不太确定,但我认为如果你不调用
CallNextHookEx
而是返回一个空指针,你可以中断链。但这是你通常不应该做的事情;)
致以诚挚的问候,
奥利弗·哈纳皮
跳过调用
CallNextHookEx
以防止传播特定的按键事件。回复:使用 SendKeys 输入 Unicode 输入:“如果您的应用程序旨在通过各种键盘进行国际使用,则使用 Send 可能会产生不可预测的结果,应避免使用。” -MSDN基本上我认为SendKeys不明确支持发送Unicode输入。
您是否看过 Microsoft Text Services Framework 而不是您正在尝试的这种方法?我认为它基本上是为了解决您想要做的事情而构建的。
SharpHook
库。
SharpHook 提供了跨平台的全局键盘和鼠标钩子 .NET,以及模拟输入事件的能力。这是一个薄薄的包装纸 libuiohook 并提供对其功能的直接访问以及 更高级别的类型来使用它。