Текущий архив: 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.48 MB
Время: 0.032 c