Форум: "Начинающим";
Текущий архив: 2014.06.29;
Скачать: [xml.tar.bz2];
ВнизssShift + vk_numpad1 Найти похожие ветки
← →
Viktor (2013-08-26 13:39) [0]
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Shift=[ssShift] then ShowMessage("1"); //ok
if Key=VK_NUMPAD1 then ShowMessage("2"); //ok
if (Shift=[ssShift]) and (Key=VK_NUMPAD1) then ShowMessage("3"); //не работает
end;
Как отловить ssShift+vk_numpadN (N in 1..9)?
← →
Viktor (2013-08-26 13:43) [1]Поправка:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Shift=[ssShift]) and (Key=VK_NUMPAD1) then ShowMessage("3"); //не работает
end;
отдельно отprocedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Shift=[ssShift] then ShowMessage("1"); //ok
if Key=VK_NUMPAD1 then ShowMessage("2"); //ok
end;
← →
Германн © (2013-08-26 13:57) [2]Клавиша 1 на цифровой клавиатуре при нажатом Shift"е это VK_END
← →
Viktor (2013-08-26 14:43) [3]Да, спасибо, но как отличить нажатие (shift+numpad1) от end?
← →
ProgRAMmer Dimonych © (2013-08-26 22:58) [4]Судя по наблюдаемому в Spy++ идея гиблая: у меня на обычный End приходят:
WM_KEYDOWN <End>
WM_KEYUP <End>
А на Shift + NumPad1 вот такая последовательность:WM_KEYDOWN <Shift>
WM_KEYUP <Shift>
WM_KEYDOWN <End>
WM_KEYUP <End>
WM_KEYDOWN <Shift>
WM_KEYUP <Shift>
Поскольку OnKeyDown вызывается при получении WM_KEYDOWN, внутри обработчика просто так отличить ситуации не получится. Пытаться с помощью флагов отслежвать последовательности, как приведённая мной, бесполезно, т.к. не отличить от последовательного нажатия трёх клавиш (Shift End Shift). Ещё один костыль — попробовать GetAsyncKeyState(), но такое решение будет неправильным, т.к. эта функция возвращает текущее состояние клавиши, а не состояние на момент ввода End или Shift + NumPad1. Возможно, поможет DirectInput, но это (а) отнюдь не для начинающих, (б) для данной задачи может оказаться слишком дорого и (в) не факт, что он сможет.
Предлагаю задуматься о целесообразности выбора таких сочетаний клавиш:
1) Если пользователь нажимает Shift + NumPad1, возможно, он действительно хочет ввести именно End (хотя это и странно).
2) Что будет, если у пользователя нет NumPad? Например, ноутбук/нетбук.
← →
умный-преумный (2013-08-27 00:12) [5]работать не с виртуальными кодами.
http://www.webdelphi.ru/2009/08/rabota-s-klaviaturoj-chitaem-virtualnye-i-skan-kody-klavish/
← →
умный-преумный (2013-08-27 00:14) [6]
> 2) Что будет, если у пользователя нет NumPad? Например,
> ноутбук/нетбук.
а) у меня на ноутбуке есть
б) в любом случае пользователю должна даваться возможность переназначения (может, сторонее приложение уже юзает, а оно более симпатично)
← →
ProgRAMmer Dimonych © (2013-08-27 02:25) [7]> [6] умный-преумный (27.08.13 00:14)
> а) у меня на ноутбуке есть
Это ведь http://lurkmo.re/УМВР
> б) в любом случае пользователю должна даваться возможность
> переназначения (может, сторонее приложение уже юзает, а
> оно более симпатично)
Удачи в разрешении назначить что-нибудь на Ctrl+Alt+Del. А ещё можно назначить что-нибудь на Shift+<ЛюбаяБуква> — и пользователь офигеет от удобства интерфейса, когда начнёт набирать текст. В хорошем интерфейсе главное не тысячу фич намутить, а предоставить простой и предсказуемый доступ к функциям программы. Если в обычном состоянии Shift меняет значение клавиши на то, что написано в верхней части клавиши, не стоит менять это поведение.
> [5] умный-преумный (27.08.13 00:12)
> работать не с виртуальными кодами.
> http://www.webdelphi.ru/2009/08/rabota-s-klaviaturoj-chitaem-
> virtualnye-i-skan-kody-klavish/
Прежде чем давать советы и ссылки, проверяйте, пожалуйста, что предлагаете, и при малейшем сомнении отказывайтесь от этой идеи.
Во-первых, хуки (о них идёт речь по ссылке) в решении задачи не помогут. Потому что это всего лишь возможность встроиться в цикл обработки сообщений перед тем, как сообщение будет возвращено GetMessage() или PeekMessage(). Хук-процедура не даёт доступа ни к каким новым данным по сравнению с оконной процедурой, она только может на лету скорректировать имеющиеся.
Во-вторых, именно с виртуальными кодами в итоге там и работают. Обойтись без них в приложении не получится: это одна из основных идей аппаратно-независимой работы с клавиатурой. Аппаратно-зависимая — добро пожаловать в мир драйверов. Но это опять не для начинающих.
В-третьих, следовало бы хотя бы оценить «на глаз» уровень подготовки автора статьи. Навскидку несколько серьёзных косяков статьи, которые выдают в авторе новичка:
1) Пример на ассемблере, использующий прерывание MS-DOS, в Windows может быть выполнен только в виртуальной DOS-машине — следовательно не к месту.
2) Запись вроде «c:keyhook.txt» обычно тоже даёт повод задуматься: оно работает и так, но (а) вообще принято явно обозначать корневую директорию («C:\keyhook.txt») и (б) запись в корневую директорию диска в норме обычному пользователю запрещена.
3) Код отформатирован наугад: поначалу мне вообще показалось, что try..except у него с синтаксической ошибкой.
4) Ни одной ссылки на документацию (хотя бы MSDN по теме).
----------------
Кстати, отгадайте, какой механизм для отлова клавиатурных (и не только) сообщений использует Microsoft Spy++ :)
← →
умный-преумный (2013-08-27 03:21) [8]
> ProgRAMmer Dimonych © (27.08.13 02:25) [7]
ну не знаю. в игрушках переназначение кнопок как-то вполне нормально живет.
в некоторых специализированных программах тоже, ибо очень может несовпадать с обще(кем-то)принятым.
что касается статьи, то особо не проверял, опечатки вполне допустимы, готового идеального решения как бы и не планировал давать, просто альтернативный путь.
какой механизм у SPY++ - понятия не имею, не пользуюсь такой программой.
Ну и что касается пожалования в мир драйверов - я, честно говоря, как-то к HID привык.
Но если Вы считаете, что автор должен придерживаться другого интерфейса, работать со скан-кодами слишком сложно и безрезультатно, то я соглашусь. Мне-то что? У Меня Все Работает.
← →
умный-преумный (2013-08-27 03:25) [9]
> А на Shift + NumPad1 вот такая последовательность:
>
> WM_KEYDOWN <Shift>
> WM_KEYUP <Shift>
> WM_KEYDOWN <End>
> WM_KEYUP <End>
> WM_KEYDOWN <Shift>
> WM_KEYUP <Shift>
странно. HID-клавиатура такое не посылает.
← →
robt5 (2013-08-27 14:12) [10]http://lurkmore.so/images/f/f1/Forksforme.jpg
← →
ProgRAMmer Dimonych © (2013-08-27 16:16) [11]> ну не знаю. в игрушках переназначение кнопок как-то вполне
> нормально живет.
Против переназначения никто ничего и не говорил. Скажу больше: как минимум с D7 (а то и раньше) есть целый контрол THotKey как раз это позволяющий реализовать. Но ни одна игрушка не делает так, чтобы эквивалентные комбинации клавиш выполняли разные действия.
> > А на Shift + NumPad1 вот такая последовательность:
> >
> > WM_KEYDOWN <Shift>
> > WM_KEYUP <Shift>
> > WM_KEYDOWN <End>
> > WM_KEYUP <End>
> > WM_KEYDOWN <Shift>
> > WM_KEYUP <Shift>
>
> странно. HID-клавиатура такое не посылает.
Вы же не пользуетесь Spy++. Каким инструментом смотрели?
← →
Германн © (2013-08-27 18:32) [12]
> Но ни одна игрушка не делает так, чтобы эквивалентные комбинации
> клавиш выполняли разные действия.
Ну хочется автору странного. Другие вон хотят иметь одновременно два хоткея - "Ctrl" и "Ctrl+F1"
← →
brother © (2013-08-27 18:35) [13]имхо, обычно нажимают в начале на ctr, а потом уже на key...
← →
умный-преумный (2013-08-27 19:06) [14]
> Вы же не пользуетесь Spy++. Каким инструментом смотрели?
Device Monitoring Studio от hhdsoftware
← →
ProgRAMmer Dimonych © (2013-08-27 21:31) [15]> [14] умный-преумный (27.08.13 19:06)
По поверхностному гуглежу могу предположить, что оно показывает данные, приходящие от устройства. То, что привёл я, — список оконных сообщений, которые может получить приложение. Данные непосредственно от устройства, без их предварительного преобразования в оконные сообщения — это в драйвер. Немного странно зайти в курятник и говорить, что там нет гусей, не находите?
← →
ProgRAMmer Dimonych © (2013-08-27 21:32) [16]> [13] brother © (27.08.13 18:35)
> имхо, обычно нажимают в начале на ctr, а потом уже на key...
Начинающие пользователи иногда честно пытаются нажать именно одновременно обе, причём быстро. Конец немного предсказуем :)
← →
умный-преумный (2013-08-27 22:35) [17]
> Немного странно зайти в курятник и говорить, что там нет
> гусей, не находите?
да я уже давно осознал, что некоторая привязанность к железу слегка попутала меня, но тактично промолчал.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2014.06.29;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.002 c