Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как послать сообщение о нажатии комбинации клавиш


Автор: StayAtHome 3.7.2004, 01:26
Нужно послать контролу сообщение о нажатии комбинации клавиш. Надо что-то вроде WM_KEYDOWN пользовать. Вроде ничего сложного: Perform(WM_KEYDOWN, VK_Insert, 0). Но, это работает только если "нажимается" одиночная клавиша. А если мне надо послать нажатие комбинации клавиш, к примеру Ctrl+Insert? Читал справку, но не совсем понял. Надо передавать то-то в WParam, но не получается.
Поделитесь куском кода, плз. Желательно универсального (чтоб можно было передать и Ctrl+Alt+Shift+Enter к примеру)

Автор: _hunter 3.7.2004, 12:06
один МАЛЕНЬКИЙ smile.gif вопрос
когда ты вешеш хот-кей ты его вешаеш на какую клавишу? на Ctrl+Alt+Shift+Enter или может всетаки на Enter с соответствующими клавишами?
или когда ты ловиш нажатия клавиш ты что ловиш? тоже, по-моему, Enter

соответственно и посылать нужно так же:
шлеш клавишу а с помощью SetKeyboardState() устанавливаеш состояние функциональных клавиш

Автор: StayAtHome 3.7.2004, 19:59
_hunter
Логично.
А все-таки кусок кода можно?

Автор: _hunter 3.7.2004, 20:01
дык в чем еще проблема?

Автор: _hunter 3.7.2004, 20:18
BYTE keyboardState[255];
keyboardState[0x41] = 1;//A
keyboardState[0x10] = 1;//SHIFT key
SetKeyboardState(keyboardState);

в результате должно получится Shift+A
(но не проверял )

Автор: Guest 5.7.2004, 01:08
Регистрация горячих клавиш в системе

RegisterHotKey(Handle, atom, MOD_ALT or MOD_CONTROL, VK_Insert and 13);

Не уверен только в подчёркнутом, не пробовал.

При завершении приложения должен уничтожить регистрацию:

UnregisterHotKey(Handle, atom);

atom: Integer ,он не должен лежать в диапазоне $C000 ДО $FFFF и лежать в диапазоне от 0 до $BFFF. Или можно задать уникальный индификатор с помощью функциуй GlobalAddAtom(PChar(s)); где s - строка с адресом вызываемоо приложения.

Пример обработчика:

....
private
{ Private declarations }
procedure WMHotKey(var a:TWMHotKey); message WM_HOTKEY;
....
procedure TForm1.WMHotKey(var a:TWMHotKey);
begin
if (a.HotKey=25) then
begin
// здесь вызываем приложение
end;
end;

Работает даже если приложение не активно

Автор: Albinos_x 5.7.2004, 01:11
Guest это я

Автор: _hunter 5.7.2004, 18:12
и каким боком обработка нажатия клавиши относится к нажатию клавиши?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)