2014-01-30 2 views
0

Я имитируя нажатие Ctrl кнопку с помощью:Simulate Ctrl-кнопка нажата

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

keybd_event(VK_CONTROL, 0, 0, 0); //key down 
/* Stuff which needs ctrl to be pressed is done here */ 
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); //key up 

Этот код находится в файле .dll. DLL используется в приложении WPF. Теперь у меня странное поведение, что нажатый ключ Ctrl распознается, только если окно WPF НЕ активно. Значение, когда я нажимаю на другое окно для деактивации окна WPF и принудительно запускаю код без активации окна WPF, снова работает. После щелчка по окну WPF он больше не работает.

Все идеи в чем проблема?

Редактировать: Я переместил код из dll в приложение wpf, которое ничего не изменило. В приложении WPF я тестировал:

keybd_event(VK_CONTROL, 0, 0, 0); 
child.RaiseEvent(new RoutedEventArgs(Button.ClickEvent)); 
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); 
+0

Зачем вы используете импорт dll для этого? – ThaMe90

+0

Потому что я использую его в любом случае для некоторых других вещей. Но я попробовал разные решения, чтобы поднять ключевые события. Все решения привели к такому же поведению. – andineupert

+0

'keybd_event' является асинхронным. Используйте 'SetKeyboardState'. установите все 256 байтов в 0, кроме одного в индексе VL_CONTROL (установите на -128 или 0x80). Используйте снова со всеми 0 после синхронного RaiseEvent – manuell

ответ

0

manuell упомянул решение и объяснил проблему в третий комментарий на мой вопрос:

keybd_event является асинхронным. Используйте SetKeyboardState. установите все 256 байтов в 0, кроме одного в индексе VL_CONTROL (установите на -128 или 0x80). снова использовать со всеми 0 после синхронного RaiseEvent - manuell

Joe Whites объясняет немного дальше и предлагает потенциально хорошее решение также:

Manuell делает хорошую точку о keybd_event является асинхронным - и вы следуйте за ним с вызовом RaiseEvent, который, я считаю, является синхронным. Таким образом, вы вызываете свое событие, прежде чем ваше приложение имеет возможность обработать сообщение «CTRL было нажато». Попробуйте обернуть вызов RaiseEvent внутри Dispatcher.BeginInvoke (т. Е. Зарегистрировать обратный вызов для запуска после того, как сообщение «CTRL было нажато» обработано) и посмотреть, устраняет ли это вашу проблему. - Joe White

Спасибо!