Форум » [x]Harbour » Нажатия клавиш ALT , SHIFT , CTRL » Ответить

Нажатия клавиш ALT , SHIFT , CTRL

Dima: В своей программе на ряд этих клавиш повесил свои функции. Имею в виду нажатие правого(левого) SHIFT и тд (в теме указал) Все четко работает , но есть косяк от которого ни как не могу избавиться. Допустим программа загружена , переключаюсь скажем в EXCEL и там жму одну из этих кнопок и моя прога на это реагирует хотя и не в фокусе. Хорошо если на этих педалях висят безобидные функции типа поиска а если нет. В журнале заявок у себя в проге я делал скрытое удаление заявки минуя журнал корректировок , это удаление у меня срабатывало так: жмем правый SHIFT и держим не менее 2 секунд, отпускаем и жмем левый SHIFT и заявка тю тю. Находясь в EXCEL и набирая текст такая комбинация может легко сработать в проге. Как бороться с этим не пойму. Юзал разные функции для поимки нажатий этих клавиш , результат одинаков. PS Harbour ,GTWVT

Ответов - 13

Sergy: Нужно поймать событие HB_K_LOSTFOCUS и до тех пока не будет HB_K_GOTFOCUS - игнорировать все эти нажатия. Для GTWVT подойдет, для GTWVG - нет.

Andrey: Dima пишет: Harbour ,GTWVT У меня в проге на хХарборе даже мышка по меню выбирает, хотя поверх окна программы ВОРД наложен. Благо меню печати последнее... Побороть это не смог.

Dima: Sergy Не совсем понял. Вот самодостаточный пример. При нажатии ALT или SHIFT или CTRL если программа не в фокусе выход из нее не должен происходить а он происходит. [pre2] Proc main local nkey:=0 local lnkey:=0 local aret:={1001,1000,1005,1004,1003,1002} do while .t. nKey:=ft_sinkey(0.01) if nKey==27 exit else ? nkey endif lnkey:=iskey() // вот тут нужно что бы не срабатывало если окно не в фокусе if lnkey#0 nkey:=lnkey exit endif if ascan(nKey,aret)>0 exit endif enddo return ************************** Func Iskey() local iStatus:={GetLShiftState(),GetRShiftState(),GetLAltState(),GetRAltState(),GetLCtrlState(),GetRCtrlState()} local aret:={1001,1000,1005,1004,1003,1002} local ret:=0 local nret for each nret in iStatus if nret<0 ret:=aret[Hb_enumindex()] exit endif next return ret *********************** #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" HB_FUNC( GETLCTRLSTATE ) { hb_retni( GetKeyState(VK_LCONTROL) ); } HB_FUNC( GETRCTRLSTATE ) { hb_retni( GetKeyState(VK_RCONTROL) ); } HB_FUNC( GETLSHIFTSTATE ) { hb_retni( GetKeyState(VK_LSHIFT) ); } HB_FUNC( GETRSHIFTSTATE ) { hb_retni( GetKeyState(VK_RSHIFT) ); } HB_FUNC( GETLALTSTATE ) { hb_retni( GetKeyState(VK_LMENU) ); } HB_FUNC( GETRALTSTATE ) { hb_retni( GetKeyState(VK_RMENU) ); } #pragma ENDDUMP [/pre2] PS Сборка hbmk2 test -gtwvt -lxhb -lhbnf


Sergy: Dima пишет: Не совсем понял. Вот самодостаточный пример. При нажатии ALT или SHIFT или CTRL если программа не в фокусе выход из нее не должен происходить а он происходит. Вот что имелось в виду: [pre2] #include "inkey.ch" Proc main local nkey:=0 local lnkey:=0 local aret:={1001,1000,1005,1004,1003,1002} local lFocused := .T. do while .t. nKey:=inkey(0.01,INKEY_ALL + HB_INKEY_GTEVENT) if nKey==27 exit elseif nKey == HB_K_LOSTFOCUS lFocused := .F. elseif nKey == HB_K_GOTFOCUS lFocused := .T. else ? nkey endif IF lFocused lnkey:=iskey() // вот тут нужно что бы не срабатывало если окно не в фокусе if lnkey # 0 nkey:=lnkey exit endif ENDIF if ascan(nKey,aret)>0 exit endif enddo return [/pre2]

Dima: Sergy Спасибо !

Sergy: Dima - не за что. Ты мне лучше скажи, как "правильно" читать в приложении статусы Shift, Ctrl, Alt ? Если опрашивать XX раз в секунду состояние клавиатуры - так это рудимент из эпохи MS-DOS получается, а как по другому - не пойму...

Dima: Sergy пишет: Ты мне лучше скажи, как "правильно" читать в приложении статусы Shift, Ctrl, Alt ? Если опрашивать XX раз в секунду состояние клавиатуры - так это рудимент из эпохи MS-DOS получается, а как по другому - не пойму... Примерчик то есть выше. Да "рудимент" но работает , использую исключительно при работе с бровсом. Привык народ юзать ALT для поиска по названию и CTRL для поиска кода. Предлагал им другие педали , не хотят. По ходу если опрашивать так INKEY(0.01) то и "задержки" нет да и проц не грузит.

Dima: Можно ли как то получить хендл текущего активного окна ?

Dima: Проехали. Видимо так [pre2] #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> HB_FUNC (GETFOREGROUNDWINDOW) { HWND hWnd = GetForegroundWindow(); hb_retnl ((LONG) hWnd); } #pragma ENDDUMP [/pre2] Плотно чеканул , работает норм ! В самом начале функции считал хэндл активного окна и затем перед считыванием (Alt Ctrl Shift) ниже сверяю с хэндлом активного окна , не совпало.......досвидос.

Sergy: При запуске программы её окно может быть неактивным...

Dima: Sergy пишет: При запуске программы её окно может быть неактивным... Это я не верно написал. На самом деле хэндл считываю находясь в бровсе , именно там идет обработка этих педалей. Примерно так [pre2] Func My_browse(...) Local hwnd:=GETFOREGROUNDWINDOW() ......... ........... if GETFOREGROUNDWINDOW()==hwnd * тут обработка нажатий Alt , Ctrl , Shift endif ............... ................ return [/pre2]

petr707: Поставить требование подтверждения оператора на вопрос {Нет, Да} - по дефолту - в {Нет} Оператор должен выбрать {стрелка вправо, Enter} или мышкой. Чужие из буфера keyboard вряд ли пройдут. Так устроено - включение/выключение мобильника - две клавиши по очереди.

Dima: Sergy пишет: При запуске программы её окно может быть неактивным... Натолкнул ты меня на одну мыслю.....проверил. Ты прав. Слегка изменил код. Сенкс !



полная версия страницы