【发布时间】:2013-03-18 23:09:50
【问题描述】:
我有一个应用程序可以记录用户按下的任何内容,但是当我按下特殊字符(如´ 和a)来获取á 时,我得到´´a;当我想得到à 时,同样的事情,然后我得到``a,所以所有特殊字符都输入两次,然后输入常规字符。
我一直在寻找,但真的找不到任何东西。但我注意到问题出在ToAscii 方法中,没有正确输入字符。
public string GetString(IntPtr lParam, int vCode)
{
try
{
bool shift = Keys.Shift == Control.ModifierKeys || Console.CapsLock;
string value = "";
KeyboardHookStruct MyKeyboardHookStruct =
(KeyboardHookStruct)Marshal.PtrToStructure(
lParam, typeof(KeyboardHookStruct));
byte[] keyState = new byte[256];
byte[] inBuffer = new byte[2];
DllClass.GetKeyboardState(keyState);
var ascii=
DllClass.ToAscii(
MyKeyboardHookStruct.vkCode,
MyKeyboardHookStruct.scanCode,
keyState, inBuffer, MyKeyboardHookStruct.flags
);
if (ascii == 1)
{
char key = (char)inBuffer[0];
if ((shift) && Char.IsLetter(key))
key = Char.ToUpper(key);
value = key.ToString();
}
return value;
}
catch (Exception)
{
return "";
}
}
我是否遗漏了什么或做错了什么?所有其他字符都可以正常工作,但特殊字符以双字符形式出现。
编辑:
尝试改用ToUnicode。
[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern int ToUnicode(
uint virtualKey, uint scanCode, byte[] keyStates,
[MarshalAs(UnmanagedType.LPArray)] [Out] char[] chars,
int charMaxCount, uint flags);
public string GetString(IntPtr lParam, int vCode)
{
try
{
bool shift = Keys.Shift == Control.ModifierKeys || Console.CapsLock;
string value = "";
KeyboardHookStruct MyKeyboardHookStruct =
(KeyboardHookStruct)Marshal.PtrToStructure(
lParam, typeof(KeyboardHookStruct));
byte[] keyState = new byte[256];
byte[] inBuffer = new byte[2];
char[] chars = new char[2];
DllClass.GetKeyboardState(keyState);
int val = 0;
val = ToUnicode(
(uint)MyKeyboardHookStruct.vkCode,
(uint)MyKeyboardHookStruct.scanCode,
keyState, chars, chars.Length, 0
);
val = ToUnicode(
(uint)MyKeyboardHookStruct.vkCode,
(uint)MyKeyboardHookStruct.scanCode,
keyState, chars, chars.Length, 0
);
if (val == 1)
{
char key = (char)chars[0];
if ((shift) && Char.IsLetter(key))
key = Char.ToUpper(key);
value = key.ToString();
}
return value;
}
catch (Exception)
{
return "";
}
}
请有人帮助我,我真的需要解决这个问题=/。
编辑:
int val = -1;
if (IsDeadKey((uint)vCode))
{
while (val == -1)
{
val = ToUnicode(
(uint)MyKeyboardHookStruct.vkCode,
(uint)MyKeyboardHookStruct.scanCode,
keyState, chars, chars.Length, 0
);
}
}
else
val = ToUnicode(
(uint)MyKeyboardHookStruct.vkCode,
(uint)MyKeyboardHookStruct.scanCode,
keyState, chars, chars.Length, 0
);
所以现在我尝试调用ToAscii 或ToUnicode 几次来刷新真实角色,但没有成功。我做错了吗?
和ASCII一样,首先调用´我得到-1,所以我再次调用它,然后我得到1;然后我按a,得到á,但我只得到a。同样的事情,如果我连续两次使用ToUnicode,我只会得到a 而不是á,依此类推......
【问题讨论】:
-
键盘记录器...它们甚至不应该存在。
-
我完全同意我的朋友,但这不是你想象的那种键盘记录器。这实际上是一个学校项目,供那些难以记住用户名/密码的人使用,使用此工具,他们可以将所有内容保存在安全的地方。
-
是的,键盘记录器和密码没有什么不安全的。
-
@syncis:现在你可以让它工作了。
-
@KenKin 其实没有,我没有 =/
标签: c# winforms logging character-encoding keycode