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

Вниз

Как назначить событие кнопке?   Найти похожие ветки 

 
Tuman   (2004-05-02 19:44) [0]

Как назначить событие кнопке функциями API, зная ее хандлер, т.е. я создал кнопку на форме другого процесса таким кодом:

Button:=CreateWindow("BUTTON","OK",WS_CHILD  or WS_VISIBLE,
                       0,0,200,50,hParentWnd,0,GetWindowLong(hParentWnd,GWL_HINSTANCE),nil);

и теперь мне нужно назначить ей событие OnClick. Подскажите, как можно это сделать.


 
Anatoly Podgoretsky ©   (2004-05-02 20:08) [1]

Ты чего, Win Apu ничего не знает про Дельфи и ее события. Так что отказ от АПИ в пользу классов.


 
Tuman   (2004-05-02 20:10) [2]

А чего делать-то?


 
Tuman   (2004-05-02 20:13) [3]

Вообще-то я имел ввиду отлов сообщения нажатия, но может есть другие способы.


 
Cobalt ©   (2004-05-02 20:15) [4]

Дык, в основном обработчике событий.


 
Tuman   (2004-05-02 20:31) [5]

Покопался тут в АПИ СДК и нашел:
SetWindowLong(hButton,GWL_WNDPROC,??????????)
Что нужно вставлять в последний параметр?
@WindowProc не подходит.

procedure WindowProc(hwnd:HWND;uMsg:UINT;wParam:WPARAM;lParam:LPARAM);
begin
if (hwnd=Button) and (uMsg=WM_LBUTTONUP) then
ShowMessage("Click!!!")
end;


 
DVM ©   (2004-05-02 20:37) [6]


> Что нужно вставлять в последний параметр?
> @WindowProc не подходит.

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


 
SammIk ©   (2004-05-02 20:44) [7]

Пробу еще так:
VirtualProtectEx
VirtualAllocEx
WriteProcessMemory
ReadProcessMemory
и естесно
SetWindowLong(hButton,GWL_WNDPROC,адре скоторыи ты выделил VirtualAllocEx)


 
Tuman   (2004-05-02 20:52) [8]

У кого-нить есть алгоритм созлания ловушки WH_MOUSE? Оч надо.


 
Cobalt ©   (2004-05-02 20:53) [9]

Смотри в статьях - хуки на любой вкус


 
DVM ©   (2004-05-02 20:56) [10]


> У кого-нить есть алгоритм созлания ловушки WH_MOUSE? Оч
> надо.

Тебе подойдет любая ловушка. Главное внедрится в адресное пространство процесса. А там ставишь свою оконную процедуру кнопке и внутри процедуры обрабатываешь все сообщения своей кнопки.
Статья про хуки на этом сайте.


 
Tuman   (2004-05-02 23:58) [11]

ТАКОЕ дело:

хук я вставил, кнопка его ловит, но ни один раз а до исчерпания системоресурсов, что делать?

код такой:
В DLL:

function Hook(code,wParam,lParam:Integer):LResult;stdcall;
begin
if code>=0 then
       case wParam of
       WM_LBUTTONUP:
               begin
               ShowMessage("Click!!!");
               end
       end
else
       begin
       result:=CallNextHookEx(H,code,wParam,lParam);
       exit
       end;
result:=CallNextHookEx(H,code,wParam,lParam)
end;

Результат: при нажатии на кнопку бесконечно вылезает Click!!!


 
Cobalt ©   (2004-05-03 10:08) [12]

1)А ты хук ставишь только на один процесс?
2) В ловушках лучше не использовать ShowMessage, поскольку это приводит к появлению новых сообщений. Лучше передавай сообщение своему главному окну

Главная мысль - хук - не самоцель, а средство внедрения в АП другого процесса. Т.е. ставишь хук. При его срабатывании находишь окно, устанавливаешь обработчик, и снимаешь хук.
Андестенд?


 
Tuman   (2004-05-04 01:26) [13]

yes!андестенд.
Вообще мне надо, чтобы хук срабатывал только на нажатие созданной моим процессом кнопки, родителем которой является другой процесс.
Немного переделал.Вот:

function Hook(code,wParam,lParam:Integer):LResult;stdcall;
begin
if code>=0 then
       begin
       case wParam of
       WM_LBUTTONUP: SendMessage(g,WM_LBC,BC_LBUTTON,0);
       WM_RBUTTONUP: SendMessage(g,WM_LBC,BC_RBUTTON,0);
       end;
       result:=CallNextHookEx(H,code,wParam,lParam)
       end;
if code<0 then result:=CallNextHookEx(H,code,wParam,lParam)
end;

ERR: все это конечно работает, но хук срабатывает на клики по форме приложения, создавшего кнопку. И еще, как зделать чтобы ловушка корректно обрабатывала правый клик, т.к. когда он присходит вылезает конт.меню экрана и только потом срабатывает хук.
А вообще хотелось бы поставить на пр.клик PopupMenu. Как это можно правильно реализовать?


 
Cobalt ©   (2004-05-04 11:23) [14]

1) Какого типа хук ты поставил?
2) Лучше объясни человеческими словами, что ты хочешь сделать, а то непонятно=>помочь трудно, т.к. тебе советуют сделать одно (по твоему вопросу), а ты делаешь другое, и просишь уже помощи в другом вопросе.


 
faith   (2004-05-05 14:35) [15]

Если я правильно понял, то обработчик нужен определённой кнопке в твоём приложении. Так объяви глобальную переменную CtrlHWND типа HWND, при создании кнопки присвой ей значение, а потом отлавливай сообщение в WindowProc. Всё просто. А хуки тут не нужны. И сходи на http://www.developer.nm.ru, там обширный мануал по этой теме.



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

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

Наверх




Память: 0.5 MB
Время: 0.043 c
3-1084825843
Dmitry Vyacheslavovich
2004-05-18 00:30
2004.06.06
Путь к базе данных


8-1080520839
3APA3A
2004-03-29 04:40
2004.06.06
Скопировать экран в буфер


1-1085364117
Jedu
2004-05-24 06:01
2004.06.06
Скроллинг на главной форме...


4-1082826531
DoG
2004-04-24 21:08
2004.06.06
TerminatedProcess


3-1084529519
ata133
2004-05-14 14:11
2004.06.06
Выделение определенных строк в DBGrid цветом