Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1204890288
News
2008-03-07 14:44
2008.04.06
Проблема с нахождением базы данных


2-1205330172
nub
2008-03-12 16:56
2008.04.06
Ошибка с ValueListEditor


2-1205302664
Phoenix
2008-03-12 09:17
2008.04.06
Как перекинуть рисунки из одного ImageList в другой?


3-1194934491
Ega23
2007-11-13 09:14
2008.04.06
Getting Started


2-1205390476
prorock
2008-03-13 09:41
2008.04.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
Английский Французский Немецкий Итальянский Португальский Русский Испанский