Сейчас на форуме: rmn, Magister Yoda, vasilevradislav, tyns777, zombi-vadim (+5 невидимых)

 eXeL@B —› Программирование —› Как определить какая клавиша была нажата(Delphi API)
Посл.ответ Сообщение


Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 04 сентября 2008 21:39
· Личное сообщение · #1

Не могу понять, перепробывал многое, ничего. Вводи текст в поле ввода и нужна отлавливать какая клавиша была нажата. Кто знает, помогите(из названия топика, на API(желательно Delphi))

-----
Лучше быть одиноким, но свободным © $me




Ранг: 24.5 (новичок)
Активность: 0.040
Статус: Участник

Создано: 04 сентября 2008 22:22
· Личное сообщение · #2

в олли ставить остановы на вызовы (WM_KEYUP или WM_KEYDOWN)




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 04 сентября 2008 22:22
· Личное сообщение · #3

Используя SetWindowLong вставь свой обработчик (СабКлассинг) туториал есть у Iczelion'а, правда на асме.

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes





Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 04 сентября 2008 22:34
· Личное сообщение · #4

zxcZXC пишет:
в олли ставить остановы на вызовы (WM_KEYUP или WM_KEYDOWN)

мне это незачем, я пишу програму, а не иследую

coderess пишет:
вставь свой обработчик

я, так и думал. хотел взять обработчик с кейлогеров, но думал что может проще както можна

-----
Лучше быть одиноким, но свободным © $me




Ранг: 172.2 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 04 сентября 2008 23:10
· Личное сообщение · #5

SetWindowLong( hwnd, GWL_WNDPROC, (LONG)MyWndProc );
...

LRESULT CALLBACK MyWndProc(HWND wnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if (WM_COMMAND == message && BN_CLICKED == <тут сравнивать надпись кнопки> )
{
}
return CallWindowProc( (WNDPROC)g_wndProc, wnd, message, wParam, lParam );
}

-----
HOW MUCH BLOOD WOULD YOU SHED TO STAY ALIVE





Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 05 сентября 2008 00:43
· Личное сообщение · #6

ProTeuS, что то по твоему у меня не получается

-----
Лучше быть одиноким, но свободным © $me




Ранг: 106.6 (ветеран), 7thx
Активность: 0.040.02
Статус: Участник

Создано: 05 сентября 2008 07:49
· Личное сообщение · #7

А родными средствами Delphi - KeyPreview скажем у формы включить?




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 05 сентября 2008 09:09
· Личное сообщение · #8

digger70 пишет:
KeyPreview скажем у формы включить

я же сказал на API, без всякого там VCL

Я кажется нашел выход, регистрирую как горячие клавиши те клавиши что мне надо, а потом легко отлавливаю по WM_HOTKEY

-----
Лучше быть одиноким, но свободным © $me




Ранг: 172.2 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 05 сентября 2008 10:56
· Личное сообщение · #9

borov пишет:
ProTeuS, что то по твоему у меня не получается


да сорцов тьма, уже готовых реализаций. вот в гугль вбил, первая же ссылка, семпл кода только события минимизации окна, копипасть и нотифай меняй на бтн_клик вместо минимайз

forum.codenet.ru/archive/index.php/t-42110.html

-----
HOW MUCH BLOOD WOULD YOU SHED TO STAY ALIVE




Ранг: 172.2 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 05 сентября 2008 10:59
· Личное сообщение · #10

ах да, ты же не написал какую кнопку в каком процессе ловишь. я бы советовал либой скомпилить, ставить SetWindowsHook а там уже устанавливать свой обработчик на все принимаемые нотифаи от всех окон, либо же фильтровать по красу, событию, процессу-родителю, либо еще каким параметрам

-----
HOW MUCH BLOOD WOULD YOU SHED TO STAY ALIVE





Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 05 сентября 2008 11:39
· Личное сообщение · #11

borovКак не как решил клавеатурный шпион сделать, для делфи лучши релиазовать через MapVirtualKey

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 05 сентября 2008 14:58 · Поправил: borov
· Личное сообщение · #12

ClockMan пишет:
решил клавеатурный шпион сделать

не как нет

ProTeuS пишет:
ты же не написал какую кнопку в каком процессе ловишь

Извини, моя задача была:
я в своей програме должен был набирать текст в ЭДИТЕ и по нажатию Enter'a: выполнить то что набрал, и очистить ЭДИТ, как бы все.

В итоге возникли такие проблемы:
- отловить нажатие клавиш (решил, но возникла следующая проблема...)
- отловить нажатие клавиш при вводе текста в ЭДИТЕ (вот с этим и парился)
- ... (возможно что то еще найду)

Я решил это все так:

[code]
function MainDlgProc(hDlg: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): bool; stdcall;
begin
case uMsg of
WM_INITDIALOG:
. . .
// Регистрирую Enter как горячую клавишу
SendMessage(GetDlgItem(hDlg, eCommand), HKM_SETHOTKEY, VK_RETURN, 0);
RegisterHotKey(hDlg, VK_RETURN, 0, VK_RETURN);
. . .
WM_HOTKEY:
// Поверяю чтобы был нажат Enter в ЭДИТЕ
if (loword(wParam) = vk_return)and(GetFocus = GetDlgItem(hDlg, eCommand)) then
begin
// Например
GetDlgItemText(hDlg, eCommand, szComamnd, 128);
MessageBox(0, szCommand, '', 32);
SetDlgItemText(hDlg, eCommand, '');
. . .
UnRegisterHotKey(hDlg, VK_RETURN);
end;

WM_DESTROY,
WM_CLOSE:
begin
UnRegisterHotKey(hDlg, VK_RETURN);
. . .
end;
[/code]

З.Ы. Я думаю это самый оптимальный вариант , но может кто то лучше придумает

З.Ы.2 В разделе "Софт, варез" есть топик "Console Viewer by BoRoV" в котором я выложил то из-за чего все это начилось. Реклама

-----
Лучше быть одиноким, но свободным © $me





Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 08 сентября 2008 18:36
· Личное сообщение · #13

Я думаю тема исчерпана, я для себя нашел самый оптимальный вариант, хотя некоторые антивиры пакованый файл палят как трояна
Тема закрыта!

-----
Лучше быть одиноким, но свободным © $me



 eXeL@B —› Программирование —› Как определить какая клавиша была нажата(Delphi API)
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати