Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.06.29;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.005 c
2-1377746622
FIL-23
2013-08-29 07:23
2014.06.29
chart имя легенды на графике


15-1386937096
Богдан80
2013-12-13 16:18
2014.06.29
Забанили в гугле


2-1373372132
Разведка
2013-07-09 16:15
2014.06.29
не преодолимый глюк


1-1326095552
solomon
2012-01-09 11:52
2014.06.29
Странность при работе с Record


15-1386952352
Kipan
2013-12-13 20:32
2014.06.29
GDI