2017-05-07 20 views
0

我目前正试图挂钩键盘,并把基本拉丁文输入(0×21 < & & 0x7e格式>)到宽字符(0xff10 < & & 0xff6d>)输入。C# - 键盘钩子+开启基本拉丁语成宽字符

简而言之,无论何时用户按下ex。键盘上的“A”键,输入应该变成“A”(所谓的“E”)。宽字符是Unicode。我没有任何问题,将A变为B.问题始于显示Unicode。

我正在使用http://inputsimulator.codeplex.com/库。到目前为止我的代码是:

private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) 
{ 
    if(nCode >= 0 && wParam == (IntPtr)257) 
    { 
     int _vkCode = Marshal.ReadInt32(lParam); 
     if(_vkCode >= 0x21 && _vkCode <= 0x7e) 
     { 
      _vkCode += 0xfee0; 
      InputSimulator.SimulateTextEntry(Encoding.Unicode.GetString(BitConverter.GetBytes(_vkCode))); 
      return (IntPtr)1; 
     } 
    } 
    return CallNextHookEx(_hookID, nCode, wParam, lParam); 
} 

但是我所有的问题都只是一个问号。

回答

0

对于有同样问题的人。我找到了解决办法。你所要做的就是生成字符 - >钩住键盘拷贝 - >钩住键盘粘贴。

public bool _vaporize = false; 
private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) 
{ 
    if(_vaporize) 
     return (IntPtr)1; 
    if(nCode >= 0 && wParam == (IntPtr)257 || wParam == (IntPtr)256) 
    { 
     int _vkCode = Marshal.ReadInt32(lParam); 
     if(_vkCode >= 0x21 && _vkCode <= 0x7e) 
     { 
      if(wParam == (IntPtr)257) 
       return (IntPtr)1; 
      Clipboard.SetText(Encoding.Unicode.GetString(BitConverter.GetBytes(_vkCode + 0xfee0))); 
      _vaporize = true; 
      SendKeys.Send("^(v)"); 
      _vaporize = false; 
      return (IntPtr)1; 
     } 
    } 
    return CallNextHookEx(_hookID, nCode, wParam, lParam); 
} 

虽然,我的解决方案不适用于比8.1更新的Windows。