![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Статические объекты Windows [D5, NT4]
Style © (2003-03-03 12:36:00)Можно ли получить доступ к статическим объектам винды зная HWND родительского окна. Например такие как Label. Просто хочу изменить Текст Label в другой программе из своей.??
Если FindNextControl вовразает только Handle Editoв Button"ов? Наверняка есть чтонибудь и для Static объектов!
Style (2003-03-06 15:28:00) [1]Народ! Я тут еще кое чего придумал. Можно из Exe вытащить описание Классов: Цените!!!
Там же есть указатели на адреса памяти.. Но как получить доступ к памяти другого процесса???
function EnumProc(hModule: integer; lpszType, lpszName: pchar;
lParam: LongInt ): boolean;
var
fl, ResID,Size: integer;
Res: HGlobal;
Mem: pchar;
begin
CreateDir("C:\ENUMRC");
ResID := FindResource(lParam,lpszName,RT_RCDATA);
size := SizeOfResource(lParam,ResId);
Res := GlobalAlloc(GHND ,Size);
Res := LoadResource(lParam,ResID);
GetMem(Mem,Size);
CopyMemory(Mem,PChar(Res),size);
fL := FileCreate("C:\ENUMRC\" + lpszName);
FileWrite(fl,Mem^,Size);
FileClose(fl);
result := true;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Module: HModule;
begin
Module := LoadLibrary(PChar(Edit1.Text));
EnumResourceNames(Module, RT_RCDATA ,@EnumProc,Module);
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if(OpenDialog1.Execute) then
begin
Edit1.Text := OpenDialog1.FileName;
end;
end;
Style (2003-03-06 09:20:00) [2]2 SPeller ©
Уменя есть прога и получше ShowWin! Гораздо интереснее возвращает инфу о WindowID
2 All
Но StaticText и Label отличаются тем что У StaticText есть HWND но у Label нет. Но все-таки в памяти они хранятся. Я перекопал весь TControl. У него кроме WindowProc ничего нет!
А у TWinControl есть перечисление Controls (TList) в котором расположены любые Control в своем Z-Order и работает он сними опять же через Control.WindowProc
Функция Perfect которая и посылает сообщение на обработчик Controla.
Интересно причем все TWinCotrol добавляют себя в перечисление SetProps. (с Атомом процесса). А когда внутри TWinControl создаеться простой Control он автоматически добавляет себя в Controls (TList). Потому и приложение знает что они как бы существуют.
Т.е зная координаты объекта мы все-равно не сможем до него докопаться в чужoм приложении.
Единственный способ наверное получить доступ к потоку памяти другого процесса и найти указатель на Control.WindowProc
Но возможно ли это???
SPeller (2003-03-06 04:38:00) [3]2 Style
Мне тебя жалко... :-))
Вот тебе программулька, которая показывает хендл, текст и класс окна под курсором. Включается и выключается средней кнопкой мыши.
http://spellersoft.narod.ru/wndinfo.rar
i-C3H7OH (2003-03-05 22:00:00) [4]>>> @MyProc := ptr(Integer(@Label1.WindowProc)) //
>>> MyProc(Msg)
ты забыл, что у каждого процесса свое адрессное пр-во, так что ты там с адресами оконных функций намудрил - это не то.
если верить хелпу, STATIC CONTROL это окно, которое не получает фокус и проч. значит текст можно установить WM_SETTEXT
Style (2003-03-05 09:06:00) [5]Игорь Шевченко>> На счет ID, я был неправ!
но все же
У любого TControl есть WindowProc, это функция CallBack
Функции - это указатель на Адрес!
Наверняка можно капнуть к памяти другого процесса и найти Адрес нужной процедуры т.е TControl.WndProc
Например мы можем Менять Label.Text и так
var
Msg: TMessage;
Txt: pchar;
begin
Txt := "New Label Text";
Msg.Msg := WM_SETTEXT;
Msg.wParam := 0;
Msg.Lparam := Txt;
Label.WindowProc(Msg)
Т.е. Если знать WndProc вернее его Dword ptr можно творить все что угодно!
А вызвать адрес хотелось бы так
var
MyProc: function(var Message: TMessage): boolean;
begin
@MyProc := ptr(Integer(@Label1.WindowProc)) //
MyProc(Msg)
Но если смотреть в Debug код несколько отличаеться от TControl.WndProc и соответсвенно адрес получаеться другой
И чего то я вообще запутался.. Но еще не все потерено!
Игорь Шевченко (2003-03-04 13:34:00) [6]
> Любой рисунок это Static.
> Но у Static есть свой ID! Вот как бы до него докапаться?
Неправда
Style (2003-03-04 12:10:00) [7]>>ZZ
Любой рисунок это Static.
Но у Static есть свой ID! Вот как бы до него докапаться?
Была одна жестокая маза я года два назад Писал прогу (для обучения работы в другой проге) т.е. Был некий Язык интерпретатор в неком файле *.tst. Например:
GETWINDOW Explorer
GETCONTROL Button1
Button1.SetWidth(56);
Хотелсь получить доступ и к Static!
Style (2003-03-04 11:58:00) [8]Удалено модератором
Примечание: Offtopic
Игорь Шевченко (2003-03-04 11:43:00) [9]Style (04.03.03 09:57)
Лучше бы ты русским языком занялся, вместо того, чтобы Label мучить
ZZ (2003-03-04 10:55:00) [10]Style
А к тому, что label - это просто рисунок :( (точно это не окно и сообщений он не получает)
ЗЫ. Сам ищу способ достать текст label"a...
Style (2003-03-04 09:57:00) [11]А речь и не идет о TLabel. Хотя Label при запуске приложения возможно становится Static объектом. А при его перерисовке дергается 15 сообщени Видны WM_GETTEXT.
Интересно я пробовал менять WNDPROC у Label таким образом можно было докапаться то его ID и HWND. Но потом я его вовсе терял.
Можно попробовать докапаться до WNDPROC формы, а потом через сообщение WM_COMMAND по ID капать Static объекты. Ну зачем то же эти сообщения нужны.???
Я еще немного покапаю конечно!
>> Игорь Шевченко
А к чему такая уверенность что "нету"???
Opuhshii (2003-03-03 16:24:00) [12]не путайте TLabel и Static,. это они внешне похожи,..
Style (2003-03-03 15:03:00) [13]WM_COMMAND
{
STN_CLICKED
STN_DBLCLK
STN_DISABLE
STN_ENABLE
STM_GETICON
STM_SETICON
}
WM_CTLCOLORSTATIC
Интересно зачем же это тогда нужно?? Все такие какието сообщения возвращают нам HWND но тока как их юзать я не понял...
Игорь Шевченко (2003-03-03 12:43:00) [14]Нету