2012-02-09 5 views
0

Я работаю над приложением, которое автоматизирует Excel через com. Проблема, с которой я сталкиваюсь, заключается в том, что иногда, когда пользователь нажимает на некоторые клавиши клавиатуры , Excel перехватывает фокус и переходит в состояние редактирования ячейки, из-за чего мое приложение терпит крах. Что может быть лучшим способом предотвратить появление сообщений клавиатуры в Excel. Я пробовал безуспешно крючок CBT и крюк GetMessage. Есть ли другие способы?Предотвращение доступа к сообщениям клавиатуры приложения

ответ

0

Объект приложения Excel 2010 имеет свойство Interactive. Установите значение false, и Excel заблокирует все входные данные клавиатуры и мыши, за исключением любых отображаемых вами диалоговых окон.

Application.Interactive = False 

Я не уверен, когда Interactive был добавлен, но я не думаю, что он существовал в Excel 2000.

+0

Это отличная идея! Никогда не задумывался о том, чтобы искать это. Он добавлен в Excel 2007 – SparcU

+0

@SparcU, вы также можете использовать 'Application.Cursor = xlWait', чтобы изменить указатель мыши на песочные часы. Просто не забудьте вернуть его в 'xlDefault', когда это будет сделано. – mischab1

0

Простейший способ, возможно, состоит в использовании BlockInput(), который блокирует ввод мыши и клавиатуры на весь рабочий стол: это полезно, если вы хотите заблокировать пользователя только на короткий период времени.

С другой стороны, если вы просто хотите, чтобы заблокировать вход от достижения конкретного ехе, используйте SetWindowsHookEx(WH_KEYBOARD_LL, ...) - в MSDN, вы можете вернуть -1 из HOOKPROC, чтобы вызвать вход игнорируется:

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

Одна из приятных особенностей крючков WH_KEYBOARD_LL заключается в том, что им не требуется отдельная DLL, вы можете делать все в своем собственном EXE. Но используйте его только против threadID приложения excel; если у вас есть HWND приложения, используйте GetWindowThreadID(), чтобы получить это.

+0

WH_KEYBOARD_LL не работает с местными крючками. Только глобальный. Поэтому, когда я его устанавливаю, это замедляет все на компьютере. – SparcU

+0

Это хорошая идея. WH_KEYBOARD hook с DLL решил мою проблему – SparcU

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