Podwójne znaki wyświetlane podczas wpisywania znaków specjalnych podczas rejestrowania naciśnięć klawiszy w c #
Mam aplikację, która rejestruje wszystko, co użytkownik naciska, ale gdy naciskam znaki specjalne, takie jak´
za
, aby dostaćá
, Dostaję´´a
; to samo, kiedy chcę się dostaćà
, wtedy dostaję``a
, więc wszystkie znaki specjalne są wpisywane dwa razy, a następnie zwykła postać zostaje wpisana po.
Szukałem na zawsze i nic nie mogę znaleźć. Ale zauważyłem, że problem tkwi wToAscii
metoda, bez której znaki są wpisywane poprawnie.
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 "";
}
}
Czy coś mi brakuje lub robię coś źle? Wszystkie inne postacie działają doskonale, ale to znaki specjalne przychodzą jako podwójne znaki.
EDYTOWAĆ:
Próbuję zToUnicode
zamiast.
[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 "";
}
}
Ktoś PROSZĘ mi pomóc, naprawdę muszę to rozgryźć=/
.
EDYTOWAĆ:
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
);
Więc teraz próbowałem zadzwonić doToAscii
lubToUnicode
kilka razy, aby opróżnić prawdziwą postać, ale bez powodzenia. Czy robię to źle?
Jak w ASCII, pierwsze wezwanie´
dostaję-1
, więc nazywam to ponownie, a potem dostaję1
; a potem naciskam jaka
, aby dostaćá
, ale wtedy tylko dostajęa
. To samo, jeśli używamToUnicode
dwa razy po sobie, dostaję po prostua
zamiastá
, i tak dalej ...