Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.011 c
7-66142
Glajik
2003-09-12 20:37
2003.11.20
Подскажите где можно найти русскую инфу по Tapi


3-65694
Mikle
2003-10-30 11:52
2003.11.20
Как перетащить таблицу SQL из одной базы в другую?


1-65983
Шишкин Илья
2003-11-10 17:43
2003.11.20
Работа с файлами


14-66070
Johnny Smith
2003-10-30 09:58
2003.11.20
Вопрос хозяевам: не с вашего ли ведома столько клонов поползло?


14-66116
Alex Konshin
2003-10-28 22:05
2003.11.20
Возвращаясь к изображению в воздухе





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский