![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как hwnd можно узнать? [D6, Win95/98]
sergeii © (2004-07-05 17:55:00)Может кто знает как узнать hwnd компонента програмы, но не знаю на цхиом написана програма.
Спасибо
Digitman (2004-07-08 12:35:00) [1]
> а вот пойавляетса вторая форма как моя програмка подвисает.
потому что она крутится в бесконечном цикле
while(FindWindow('TEditPLU', 'Edit PLU')=0)do
begin
form1.Timer1.Interval:=5000;
label9.Caption:=label9.caption+' 0';
form1.Timer1.Interval:=0;
end;
условие выхода из цикла - нахождение окна верхнего уровня
значит, окно не найдено, раз цикл бесконечный
sergeii (2004-07-08 12:23:00) [2]И ещё заметил что моя програмка после запуска второго окна перестаёт работать, когда закрываеш ето злощасное второе окно програмка доканчивает работу, что ето может быть
sergeii (2004-07-08 11:33:00) [3]Так вот ещё сделал фотографии того что у меня получаетса но ни поиму по чему не хорошо. поставил на форму таимер и сделал цикл ожидания появления формы
while(FindWindow(nil, 'Select PLU to Edit')=0)do
begin
form1.Timer1.Interval:=5000;
label4.Caption:=label4.caption+' 0';
form1.Timer1.Interval:=0;
end;
с первои формой хорошо она появляетса и из цикла выходит а вот пойавляетса вторая форма как моя програмка подвисает.
С второй формой такая ситуация что пока её не закроеш нельзя перейти ни к первои форме ни к дрыгим програмы модулям.
Имею могу выслать может станет чуть ясно что я имею ввиду
Спасибо
procedure TForm1.Button1Click(Sender: TObject);
var window1_hwnd,window2_hwnd,button1_hwnd,button2_hwnd,edit_hwnd : HWND;
i,k,len : integer;
begin
while(FindWindow(nil, 'Select PLU to Edit')=0)do
begin
form1.Timer1.Interval:=5000;
label4.Caption:=label4.caption+' 0';
form1.Timer1.Interval:=0;
end;
window1_hwnd {:HWND} := FindWindow(nil, 'Select PLU to Edit');
button1_hwnd {:HWND} := FindWindowEx(window1_hwnd, 0, nil ,'OK');
label4.Caption:=inttostr(window1_hwnd);
label5.Caption:=inttostr(button1_hwnd);
edit_hwnd {:HWND} := FindWindowEx(window1_hwnd, 0, 'TComboBox',nil);
label6.Caption:=inttostr(edit_hwnd);
ClipBoard.AsText:='123' ;
SendMessage(edit_hwnd,WM_SETTEXT,0,0);
SendMessage(edit_hwnd,WM_PASTE,0,0);
SendMessage(button1_hwnd, BM_CLICK,0,0);
while(FindWindow('TEditPLU', 'Edit PLU')=0)do
begin
form1.Timer1.Interval:=5000;
label9.Caption:=label9.caption+' 0';
form1.Timer1.Interval:=0;
end;
window2_hwnd {:HWND} := FindWindow('TEditPLU', 'Edit PLU');
button2_hwnd {:HWND} := FindWindowEx(window2_hwnd, 0, 'TBitBtn' ,'Cancel');
SendMessage(button2_hwnd, BM_CLICK,0,0);
showmessage(inttostr(window2_hwnd)+' '+inttostr(button2_hwnd));
showmessage('Конец Програмы');
end;
Digitman (2004-07-08 11:19:00) [4]Удалено модератором
Примечание: Личная переписка
sergeii (2004-07-08 09:57:00) [5]Удалено модератором
Примечание: Личная переписка
Digitman (2004-07-08 09:47:00) [6]
> sergeii © (08.07.04 09:42) [11]
есть.
SpyXX.exe - утилита в составе MS VisualStudio
sergeii (2004-07-08 09:42:00) [7]Может есть ещё програма которая показивала тоже как и WinSight32.exe только активного окна или тех елемнтов на которые показываеш. Спасибо
Digitman (2004-07-07 17:49:00) [8]
> по FindWindow()возвращает 0
это значит что либо параметры неверные задаешь (неверное имя окна) либо искомое окно не является верхнеуровневым (создается как дочернее к какому-либо окну)
возьми на вооружение граф.утилиту WinSight32.exe в составе Делфи и посмотри на искомое окно повнимательней - его имя, уровень и т.д., сравни со своими данными, получаемыми программно
для перечисления верхнеуровневых и дочерних окон в поисках нужного так же можно воспользоваться ф-циями EnumWindows и EnumChildWindows, зачастую они дают лучшие результаты чем FindWindow[Ex]
sergeii (2004-07-07 17:41:00) [9]по FindWindow()возвращает 0 getnextwindow() возвращает <>0, почему FindWindow()=0 незнаю может окно возникает после того как он ищет а может ещё что, я пытался делать задержки
while(i<100000) do i:=i+1; ето всёравно не помогает найти окно и нажать кнопку. Что можно попытатся сделать????
Спасибо
Digitman (2004-07-07 17:31:00) [10]а ты уверен, что button2_hwnd <> 0 перед посылкой BM_CLICK ?
с чего ты взял, что getnextwindow() вернет хэндл именно того окна, кнопка Cancel на котором тебя интересует ?
вместо сомнительного getnextwindow() ищи второе окно точно так же как первое - по FindWindow()
sergeii (2004-07-07 17:18:00) [11]всёравно чтото не то, запускаю я програму и потом свою програму, моя програма находит первое окно находит на нём edit и button1 в edit она вводит 123 и жмёт button1, тогда поябляетса второе окошко, которое оказиваетса поверх всех окон и ето окно становитса активным, на етом окне две кнопки OK и Cancel таквот ни одна из етих кнопок не жмчтса. Может изза того что моя програмка не активная у меня такие проблемы. Ошибку нашол может ви не поняли, должно быть так
window2_hwnd:=getnextwindow(window1_hwnd,GW_HWNDNEXT);
button2_hwnd {:HWND} := FindWindowEx(window2_hwnd, 0, nil ,'Cancel');
SendMessage(button2_hwnd, BM_CLICK,0,0);
Digitman (2004-07-07 16:59:00) [12]ну так и пошли первой форме WM_ACTIVATE перед тем как посылать BM_CLICK кнопке
sergeii (2004-07-07 16:47:00) [13]window1_hwnd {:HWND} := FindWindow(nil, 'Select PLU to Edit');
button1_hwnd {:HWND} := FindWindowEx(window1_hwnd, 0, nil ,'OK');
edit_hwnd {:HWND} := FindWindowEx(window1_hwnd, 0, 'TComboBox',nil);
ClipBoard.AsText:='123' ;
SendMessage(edit_hwnd,WM_SETTEXT,0,0);
SendMessage(edit_hwnd,WM_PASTE,0,0);
SendMessage(button1_hwnd, BM_CLICK,0,0);
window2_hwnd:=getnextwindow(window1_hwnd,GW_HWNDNEXT);
button1_hwnd {:HWND} := FindWindowEx(window1_hwnd, 0, nil ,'Cancel');
showmessage(inttostr(window2_hwnd));
showmessage(inttostr(button1_hwnd));
SendMessage(button1_hwnd, BM_CLICK,0,0);
надо на второй форме нажать кнопочку, но повидемому вследствии того что вторая форма становитса активной програма перестает работать и кнопка не жмётса.
Digitman (2004-07-07 16:28:00) [14]
> ницхего не мжеш делать со вторым
а что с ним нужно сделать-то ?
sergeii (2004-07-07 16:00:00) [15]извените, аказиваетса проблема в том что ето окно зависимо от первого окна, тоесть пока незакроеш первое окно ницхего не мжеш делать со вторым (с нужным окном). Бот етого второго окна hwnd и нужно узнать.
Спасибо
Digitman (2004-07-05 18:10:00) [16]
> sergeii © (05.07.04 17:55)
в общем случае - никак
в частном случае нужно быть уверенным, что компонент (точнее - контрол) действительно имеет собственное окно, т.е. он не "рисованый" на "чужом" окне, и нужно знать класс этого окна и/или подпись (имя) этого окна .. только тогда есть шансы нахождения окна
clickmaker (2004-07-05 18:06:00) [17]FindWindow