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

Вниз

Программная всатка символа   Найти похожие ветки 

 
RustiK ©   (2003-09-12 15:34) [0]

Помогите пожалуйста с проблемой.
Я поставил хук на нажатие клавиши. Например на букву X. А теперь мне нужно закодить так чтобы после нажатия буквы Х у меня выводилась не Х, a например W.
Я писал так

h:=GetForegroundWindow;
sendMessage(h, WM_char, Ord("W"),0);

подскажите пожалуйста что не так.


 
AGAMEMNUM ©   (2003-09-12 18:11) [1]

:) - тот эдит в который производится ввод это чилд на фореграундвиндов


 
SPeller ©   (2003-09-13 02:31) [2]

А лучше использовать keybd_event чтобы не геморроиться с чайлдами.


 
RustiK ©   (2003-09-13 11:12) [3]

Сасибо я попробовал keybd_event ПОМОГЛО. А если мне надо ввести русскую букву или непечатаемый символ? Тогда что делать?


 
guest   (2003-09-13 14:25) [4]

set another hook (this hook can"t change key value)
see MSDN


 
SPeller ©   (2003-09-13 15:10) [5]

А если bVk = код символа, а bScan = 0?


 
RustiK ©   (2003-09-13 17:58) [6]

кстати я нашел как эмулировать нажатие клавишь Alt+0156 например
keybd_event(VK_BACK,0,0,0);
keybd_event(vk_menu,0,0,0);
keybd_event( VK_NUMPAD0, MapVirtualKey(Vk_NumPad0,0), 0, 0 );
keybd_event( VK_NUMPAD0, MapVirtualKey(Vk_NumPad0,0), KEYEVENTF_KEYUP, 0 );
keybd_event( VK_NUMPAD1, MapVirtualKey(Vk_NumPad1,0), 0, 0 );
keybd_event( VK_NUMPAD1, MapVirtualKey(Vk_NumPad1,0), KEYEVENTF_KEYUP, 0 );
keybd_event( VK_NUMPAD5, MapVirtualKey(Vk_NumPad5,0), 0, 0 );
keybd_event( VK_NUMPAD5, MapVirtualKey(Vk_NumPad5,0), KEYEVENTF_KEYUP, 0 );
keybd_event( VK_NUMPAD6, MapVirtualKey(Vk_NumPad6,0), 0, 0 );
keybd_event( VK_NUMPAD6, MapVirtualKey(Vk_NumPad6,0), KEYEVENTF_KEYUP, 0 );
keybd_event(vk_menu,0,KEYEVENTF_KEYUP,0);

Но вот другая проблема, теперь мне надо отследить двойное нажатие клавиш например: Alt+X


 
RustiK ©   (2003-09-13 17:59) [7]

keybd_event(VK_BACK,0,0,0);
пишу потомучто ловушка стоит на событее клавиатуры


 
SPeller ©   (2003-09-14 10:34) [8]

При приёме сообщения о клавиатурном событии при нажатии Х где-то в параметрах есть информация о состоянии управляющих клавиш Shift, Ctrl и Alt. Не пропускай Х и получится, что нажали просто Alt.


 
RustiK ©   (2003-09-14 10:45) [9]

А в том то и дело мне надо что бы хук срабатывал только при нажатии Alt и X. Именно двух этих клавишь нажатых одновременно


 
SPeller ©   (2003-09-14 16:46) [10]

Если нажали альт - то нажали, это ты не исправишь, а вот Х отфильтровать запросто. Сработает у тебя хук только если нажали Х, а перед этим была нажа ещё и альт.


 
livid ©   (2003-09-14 18:29) [11]

А не судьба хоткей поставить?
BOOL RegisterHotKey(
HWND hWnd, // window to receive hot-key notification
int id, // identifier of hot key
UINT fsModifiers, // key-modifier flags
UINT vk // virtual-key code
);


или на худой конец, если уж с хуком, то юзай процедуру
function KeybHook(Code: Integer;
wParam: WPARAM; //virtual key
lParam: LPARAM //Misc
): LRESULT; stdcall;


а из lParam извлекай бит 29. Если 1, то альт нажат, если 0 альт не нажат.


 
RustiK ©   (2003-09-15 09:49) [12]

Подскажите пожалуйста синтаксис проверки
lParam(29)=1 или как?


 
RustiK ©   (2003-09-15 09:50) [13]

Простите за тупой вопрос как извлечь из lParam этот бит?


 
pasha_676 ©   (2003-09-15 10:06) [14]


> Простите за тупой вопрос как извлечь из lParam этот бит?

Маска + логические операции.


 
novenkiy   (2003-09-15 10:30) [15]

Все ребята темя закрыта я нашел выход.
До того как отловить какая нажаты была клавиша я проверяю былали нажата Alt, т.е. ставлю проверку примерно так:

if GetAsyncKeyState(VK_menu) <> 0 then;

а дальше если нажата идет обработка самих клавиш на отлов

код получается такой
function KeyboardProc(c0de, wm_char, lParam : integer): Lresult; stdcall;
begin
if (c0de =HC_ACTION) then
begin
if GetAsyncKeyState(VK_menu) <> 0 then
case wm_char of
ord("X"):
begin

hw:=GetForegroundWindow;
SetWindowText(hw,"Alt+Z");
end;



ORD("Z"):
begin
hw:=GetForegroundWindow;
SetWindowText(hw,"Alt+Z");
end;
end;
end else

begin
result := CallNextHookEx(H, c0de, wm_char, lParam);
exit;
end;

result := CallNextHookEx(H, c0de, wm_char, lParam);
end;

Все проблема решена всем бальшое СПАСИБО за то, что откликнулись.


 
Livid ©   (2003-09-17 18:52) [16]

Бит извлечь доволтно легоко.
(lParam and $10000000)


 
novenkiy   (2003-09-25 15:56) [17]

Удалено модератором



Страницы: 1 вся ветка

Текущий архив: 2003.11.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.028 c
1-65988
Oleg_
2003-11-10 15:18
2003.11.20
Куда то ресурсы


1-65853
Scordion
2003-11-09 21:26
2003.11.20
Подскажите компонент


3-65797
AlexenderG
2003-10-30 12:53
2003.11.20
У кого есть DsgnIntf.pas и DsgnIntf.dcu? Пожалуйста очень надо!!!


1-65864
Chlavik
2003-11-07 19:25
2003.11.20
TStatusBar и OwnerDraw какойто страшный глюк :)


1-66003
Hatawa
2003-11-09 08:53
2003.11.20
Копирование файлов