Форум: "WinAPI";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];
ВнизЗамена обработчика события в чужом окне Найти похожие ветки
← →
Человек С вопросом (2007-03-01 17:15) [0]Можете помочь с Delphi?
Дело в том что я хочу объекту на чужой форме назначить свой обработчик события.
...даже правильнее сказать, Я создаю на чужой форме объект и хочу назначить ему обработчик.
Пример кода:
var
btn:TButton;
h:HWND;
begin
h:=FindWindow(Класс,Заголовок)
{Хендл нахожу правильно}
btn:=TButton.create(Form1) //Пока есть форма объект cуществует
btn.left:=...
btn.top:=...
...
btn.name="Button";
{А вот и проблема}
btn.onclick=Form1.onclick
btn.parentWindow:=h; //Помещаю на объект
end;
Кнопка создается на указанном объекте, но вот щелчек не обрабатывает.
если переписать строчку
btn.parentWindow=form1.handle
то созданная кнопка работает, и событие обрабатывает.
Можете подсказать как переназначить обработчик у чужого объекта хендл
которого известен
← →
Игорь Шевченко © (2007-03-01 17:45) [1]
> Я создаю на чужой форме объект и хочу назначить ему обработчик
Насколько чужая форма ? В другом приложении или где?
← →
Сергей М. © (2007-03-02 08:38) [2]
> как переназначить обработчик у чужого объекта хендл
> которого известен
>
SetWindowLong(h, GWL_WNDPROC, @MyWindowHandler)
Ф-ция SetWindowLong() должна быть вызвана в любом потоке того же процесса, которому принадлежит окно h.
Код ф-ции MyWindowHandler() должен размещаться в адресном пространстве того же процесса, которому принадлежит окно h.
← →
Человек С вопросом (2007-03-02 09:27) [3]
>
> Насколько чужая форма ? В другом приложении или где?
>
Системная форма, точнее говоря Shell_TrayWnd, хочу по аналогии Nero создать свой объект и обрабатывать его.
> SetWindowLong(h, GWL_WNDPROC, @MyWindowHandler)
>
> Ф-ция SetWindowLong() должна быть вызвана в любом потоке
> того же процесса, которому принадлежит окно h.
>
> Код ф-ции MyWindowHandler() должен размещаться в адресном
> пространстве того же процесса, которому принадлежит окно
> h.
>
h - хендл Shell_TrayWnd, а функцию SetWindowLong я могу использовать только в пределах своего приложения.
← →
Человек С ответом (2007-03-02 09:56) [4]SetWindowsHook()
← →
Сергей М. © (2007-03-02 10:24) [5]
> Человек С вопросом (02.03.07 09:27) [3]
> Системная форма, точнее говоря Shell_TrayWnd
Это не форма, а окно.
> функцию SetWindowLong я могу использовать только в пределах
> своего приложения.
Значит следует тем или иным образом внедрить код вызова этой ф-ции в АП процесса Explorer.exe, которому принадлежит искомое окно указанного класса.
← →
Elen © (2007-03-02 10:45) [6]
> Человек С вопросом
Попробуй создать обьект на своей форме, незначив обработчик, а потом смени ему парент через SetParent.
← →
clickmaker © (2007-03-02 11:12) [7]
> смени ему парент через SetParent
парент из чужого приложения?
← →
Сергей М. © (2007-03-02 11:16) [8]
> Elen © (02.03.07 10:45) [6]
Ну глупости же советуешь)
← →
Elen © (2007-03-02 11:25) [9]
> парент из чужого приложения?
Из своего. Создаеш на своей форме кнопку а потом SetParent"ом перекидываеш ее в чужое окно. А свою форму прячеш.
> Сергей М. © (02.03.07 11:16) [8]
Ты сам то пробовал что говориш?
← →
clickmaker © (2007-03-02 11:37) [10]
> потом SetParent"ом перекидываеш ее в чужое окно
Remarks
An application can use the SetParent function to set the parent window of a pop-up, overlapped, or child window. The new parent window and the child window must belong to the same application.
(c) MSDN
или опять буржуйские провокации?
← →
GrayFace © (2007-03-02 11:40) [11]Если кидать всю форму, то точно будет нормально.
← →
Elen © (2007-03-02 11:47) [12]
> Мастера.
А если я запускаю подопытную аппликацию из своей проги?
Вот так :unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ToolWin;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
procedure FormShow(Sender: TObject);
procedure ToolButton2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormShow(Sender: TObject);
begin
WinExec("project2.exe",1);
windows.SetParent(ToolBar1.Handle,FindWindow("Tform2","Form2"));
end;
procedure TForm1.ToolButton2Click(Sender: TObject);
begin
ShowMessage("sdsds");
end;
end.
Вроде ничего не упустила...
← →
clickmaker © (2007-03-02 11:56) [13]
> [12] Elen © (02.03.07 11:47)
и как ты предлагаешь System Tray запускать из своей проги?
← →
Elen © (2007-03-02 12:04) [14]
> clickmaker © (02.03.07 11:56) [13]
Это уже другое дело. Никак, но мне кажется что сам подход к решению ошибочный.
← →
Elen © (2007-03-02 12:06) [15]
> хочу по аналогии Nero создать свой объект и обрабатывать
> его.
А как неро делает? Что-то не замечаю за ним такого?
← →
Игорь Шевченко © (2007-03-02 12:08) [16]Elen © (02.03.07 11:25) [9]
А можно тебя как-нибудь изолировать от форума ?
← →
begin...end © (2007-03-02 12:10) [17]> Elen © (02.03.07 11:25) [9]
Тяжёлый случай...
← →
Elen © (2007-03-02 12:10) [18]
> Игорь Шевченко
Злой ты :(. Нельзя так, сам бы подсказал чего полезного, так нет ж молчиш.
← →
Игорь Шевченко © (2007-03-02 12:24) [19]Elen © (02.03.07 12:10) [18]
Я не злой, просто достало воинствующее невежество
← →
Сергей М. © (2007-03-02 13:53) [20]
> Elen © (02.03.07 12:06) [15]
> А как неро делает?
А что, собссно, Неро делает ? Иконку в трей "запуздыривает" и потом реагирует на клики по ней ? Или что-то экстраординарное ?)
← →
Rouse_ © (2007-03-02 14:08) [21]У меня Nero только иконку помещает :)))
Мошт товарищу Shell_NotifyIcon + NIM_ADD всего лишь нужно? :)
← →
Elen © (2007-03-02 14:27) [22]
> Мошт товарищу Shell_NotifyIcon + NIM_ADD всего лишь нужно?
> :)
Не ну это тогда вообще беспредел с вопросом. Никак не вяжется с " я хочу объекту на чужой форме назначить свой обработчик события." Может дийсно автор хотел в трей, а мы тут ругаемся зря...
← →
Германн © (2007-03-02 14:28) [23]Так много умных слов. И всё это только для "запуздыривания"? :)
← →
Сергей М. © (2007-03-02 14:38) [24]
> всё это только для "запуздыривания"?
Оч похоже на то)
← →
buben © (2007-03-03 14:32) [25]>>Кнопка создается на указанном объекте, но вот щелчек не обрабатывает.
PostMessage(handle,WM_LBUTTONDOWN,VK_down,0);
что-то типо этого, вначале узнай хэндел окна, затем кнопки
h := FindWindow(nil,"Form1");
buttonn:=FindWindowEx(h,0,"button","");
← →
GrayFace © (2007-03-03 14:43) [26]Может Nero панель инструментов создает? Хотя я за ней такого не замечал. В любом случае, раз это делает Nero, значит делать надо не так, как хочет автор.
← →
DVM © (2007-03-03 23:47) [27]Чего там Неро делает то? Объясните. Я просто уверен, что если что там Неро и создает, то все это стандартными средствами (плагины панели задач, например или еще что).
← →
Любитель (2007-08-08 05:43) [28]Ааа... Я понял, что онимел в виду "Неро делает ЭТО"!!
Если кто юзал Nero7(нормальную, не мини), тот знает, что она может создать на Панельке, рядом с треем, свою какую-то панельку....
Для тех, кто не понял, объясню по-проще.
ХР все тут юзают? Да. Панельку с индикатором Раскладки кто-нибудь двигал? Двигал. Вот типо того, видимо, хочет автор. Т.е. запендюрить так же свою Кнопку на Панель Инструментов и "извращатся" с ней, как вздумает. Вот.
Автор, я правильно тебя понял? ;)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.006 c