Как мне захватить и большие, и маленькие клавиши с помощью (Keys) Marshal.ReadInt32 (lParam)
+ проверка Shift.
Я хочу узнать, как захватить все клавиши клавиатуры, но не знаю, как это сделать правильно.
public delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
private static readonly LowLevelKeyboardProc _proc = HookCallback;
private static IntPtr _hookID = IntPtr.Zero;
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
try
{
Console.WriteLine((Keys)Marshal.ReadInt32(lParam));
}
catch (AccessViolationException ex) { Console.WriteLine($"Error: {ex.ToString()}"); }
}
return NativeMethods.CallNextHookEx(_hookID, nCode, wParam, lParam);
}
Многое непонятно. А как вы можете определить клавиши символов?
Можно ли конвертировать ключи в ToUnicodeEx?
просто проверьте, нажаты ли заглавные буквы или сдвиг. но наверняка может быть лучший способ
@sLw, Подскажите пожалуйста пример?
Даже если нажата клавиша Shift, полученное вами int может не быть «прописным». Похоже, вы должны каким-то образом получить представление Char и что-то вроде isUpper()
.
Проверьте мои функции кейлоггера Здесь:
функции, которые вы можете захотеть проверить:
private void Form1_Load(object sender, EventArgs e)
{
button2.Enabled = false;
try {
gHook = new GlobalKeyboardHook(); // Create a new GlobalKeyboardHook
// Declare a KeyDown Event
gHook.KeyUp += new KeyEventHandler(gHook_KeyUp);
gHook.KeyDown += new KeyEventHandler(gHook_KeyDown);
// Add the keys you want to hook to the HookedKeys list
foreach (Keys key in Enum.GetValues(typeof(Keys)))
gHook.HookedKeys.Add(key);
}
catch (Exception z)
{
}
}
public void gHook_KeyDown(object sender, KeyEventArgs e)
{
String getCharVar = getCharDown(e.KeyValue);
if (getCharVar!=null)
richTextBox1.Text += getCharVar;
}
private String getCharDown(int Value)
{
if (Value > 95 && Value < 106)
return ((char)(Value-48)).ToString();
if (Value > 64 && Value < 91)
{if (!Control.IsKeyLocked(Keys.CapsLock))
return ((char)(Value+32)).ToString();
else
return ((char)(Value)).ToString();
}
if (Value > 47 && Value < 58)
return ((char)Value).ToString();
return null;
}
PS: Вы можете перестроить проект для тестирования.
Может проверить это: stackoverflow.com/questions/6201882/convert-a-char-to-keys Или это: social.msdn.microsoft.com/Forums/vstudio/en-US/…