Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как 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


Наверх

Титульная страница Поиск, карта сайта Написать письмо