我有一個應用程序,登錄任何用戶按下,但是當我按下特殊字符,如´
與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
;然後我按01,得到á
,但後來我只得到a
。同樣的事情,如果我以後對方使用ToUnicode
兩次,我得到的只是a
代替á
,等等...
鍵盤記錄器...他們不應該存在。 – 2013-03-18 23:11:48
我完全同意我的朋友,但這不是你想到的那種鍵盤記錄器。這實際上是一個針對有記住用戶名/密碼問題的人的學校項目,通過這個工具,他們將把所有內容保存在一個安全的地方。 – syncis 2013-03-18 23:17:41
是的,關於鍵盤記錄器和密碼沒有任何不安全的地方。 – 2013-03-18 23:23:14