2013-11-14 1 views
0

мне нужно эмулировать некоторые ключи, вот код:C# KEYEVENTF_KEYUP не работает в конкретном приложении

[DllImport("user32.dll")] 
private static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo); 

private const int KEYEVENTF_EXTENDEDKEY = 1; 
private const int KEYEVENTF_KEYUP = 2; 

public static void KeyDown(Keys vKey) 
{ 
    keybd_event((byte)vKey, 0, KEYEVENTF_EXTENDEDKEY, 0); 
} 

public static void KeyUp(Keys vKey) 
{ 
    keybd_event((byte)vKey, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); 
} 

KeyboardSend.KeyDown(Keys.Z); 
KeyboardSend.KeyUp(Keys.Z); 

Но в одном конкретном приложении «KeyUp» метод не работает и находится в депрессии, пока я не нажать клавишу на клавиатуре.

Что я делаю неправильно?

+0

Рассмотрите возможность установки небольшой ** задержки ** между вызовами KeyDown() и KeyUp(): 'System.Threading.Thread.Sleep (100);' –

+0

Я уже пробовал это :( – CSharpRU

+0

Вы пробовали 'SendKeys. SendWait ("z"); '? ... почему вы используете' KEYEVENTF_EXTENDEDKEY' здесь? –

ответ

0

Когда я изменил код на следующий, он, казалось, работал нормально. Я тестировал его, открывая блокнот, запуская программу, а затем удерживая клавишу «a». Он печатал строчные буквы в течение 3 секунд, затем начинал делать прописные буквы, а затем снова возвращался в нижний регистр.

public static void KeyDown(Keys vKey) 
{ 
    keybd_event((byte)vKey, 0, 0, 0); 
} 

public static void KeyUp(Keys vKey) 
{ 
    keybd_event((byte)vKey, 0, KEYEVENTF_KEYUP, 0); 
} 

System.Threading.Thread.Sleep(3000); 
KeyDown(Keys.SHIFT); 
System.Threading.Thread.Sleep(4000); 
KeyUp(Keys.SHIFT); 

Попробуйте проверить входной симулятор Windows для хорошего примера того, как имитировать нажатия клавиш. Это оболочка с открытым исходным кодом для функции SendInput в User32.dll.

Одна вещь, которую я узнал, заключается в том, что для имитации удержания клавиши вниз ее обычно недостаточно, чтобы отправить ключ, немного подождать, а затем отправить ключ вверх. Если вы хотите, чтобы клавиша повторила нажатие клавиши, как обычная клавиатура, вам нужно продолжать отправлять событие клавиатуры и заканчивать ее событием с клавишей.

http://inputsimulator.codeplex.com/

+0

Input Simulator не работает в этом приложении. – CSharpRU

0

Единственное изменение, которое я вижу в решения Ryan West «s, является то, что он снял KEYEVENTF_EXTENDEDKEY флаг от вызова функции keybd_event в третьем аргументе, в обоих KeyDown и KeyUp методов, так как результат, в методе KeyDown, третий аргумент вызова keybd_event функция 0, а в KeyUp метод, это только KEYEVENTF_KEYUP. Это только небольшое изменение вызвало KeyUp способ работать и решить вашу проблему.

Читайте о keybd_event функции в MSDN сайте правильно и даже снова, если вы читали раньше.

Они предоставляют информацию и подробную информацию об этой функции и ее аргументах. Они также объясняют все флаги, которые вы можете использовать в третьем аргументе функции keybd_event, особенно в случае вашей проблемы KEYEVENTF_EXTENDEDKEY.

Если вы будете читать правильно и снова, может быть вы поймете, почему KEYEVENTF_EXTENDEDKEY флаг вызывает ваш KeyUp метод не работать, и почему вы должны удалить этот флаг для того, чтобы вызвать ваш KeyUp метод работы.

Вы может также узнать, каким образом в будущем , вызвать функцию keybd_eventправильно, так что вы не получите каких-либо проблем с ним.

Смежные вопросы