Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1386762986
azlk2141
2013-12-11 15:56
2014.06.29
выбор мобильного оператора


2-1377232902
NBAH1990
2013-08-23 08:41
2014.06.29
Проблема с редактированием записи в БД


2-1377689079
DZM
2013-08-28 15:24
2014.06.29
Модальное окно оказывается позади


2-1374476877
Жора с Бора
2013-07-22 11:07
2014.06.29
Указатели


2-1377623196
lancomm
2013-08-27 21:06
2014.06.29
MainMenu и PageControl





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский