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

Вниз

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

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

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

Наверх





Память: 0.49 MB
Время: 0.034 c
1-1085373265
Robin
2004-05-24 08:34
2004.06.06
Вставить в Word картинку


4-1082863580
_Sh_
2004-04-25 07:26
2004.06.06
Проблема с GetFileSize


1-1085314726
Master Paleva
2004-05-23 16:18
2004.06.06
Процедура ReplaceDate


6-1082461934
Max003
2004-04-20 15:52
2004.06.06
Как задать автора сообщения?


3-1084787859
подмастерий
2004-05-17 13:57
2004.06.06
помогите советом или ссылкой на пример !





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