Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.22;
Скачать: CL | DM;

Вниз

как hwnd можно узнать?   Найти похожие ветки 

 
sergeii ©   (2004-07-05 17:55) [0]

Может кто знает как узнать hwnd компонента програмы, но не знаю на цхиом написана програма.

Спасибо


 
clickmaker ©   (2004-07-05 18:06) [1]

FindWindow


 
Digitman ©   (2004-07-05 18:10) [2]


> sergeii ©   (05.07.04 17:55)  


в общем случае - никак

в частном случае нужно быть уверенным, что компонент (точнее - контрол) действительно имеет собственное окно, т.е. он не "рисованый" на "чужом" окне, и нужно знать класс этого окна и/или подпись (имя) этого окна .. только тогда есть шансы нахождения окна


 
sergeii ©   (2004-07-07 16:00) [3]

извените, аказиваетса проблема в том что ето окно зависимо от первого окна, тоесть пока незакроеш первое окно ницхего не мжеш делать со вторым (с нужным окном). Бот етого второго окна hwnd и нужно узнать.
Спасибо


 
Digitman ©   (2004-07-07 16:28) [4]


> ницхего не мжеш делать со вторым


а что с ним нужно сделать-то ?


 
sergeii ©   (2004-07-07 16:47) [5]

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:59) [6]

ну так и пошли первой форме WM_ACTIVATE перед тем как посылать BM_CLICK кнопке


 
sergeii ©   (2004-07-07 17:18) [7]

всёравно чтото не то, запускаю я програму и потом свою програму, моя програма находит первое окно находит на нём 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 17:31) [8]

а ты уверен, что button2_hwnd <> 0 перед посылкой BM_CLICK ?
с чего ты взял, что getnextwindow() вернет хэндл именно того окна, кнопка Cancel на котором тебя интересует ?

вместо сомнительного getnextwindow() ищи второе окно точно так же как первое - по FindWindow()


 
sergeii ©   (2004-07-07 17:41) [9]

по FindWindow()возвращает 0 getnextwindow() возвращает <>0, почему FindWindow()=0 незнаю может окно возникает после того как он ищет а может ещё что, я пытался делать задержки
while(i<100000) do i:=i+1; ето всёравно не помогает найти окно и нажать кнопку. Что можно попытатся сделать????
Спасибо


 
Digitman ©   (2004-07-07 17:49) [10]


> по FindWindow()возвращает 0


это значит что либо параметры неверные задаешь (неверное имя окна) либо искомое окно не является верхнеуровневым (создается как дочернее к какому-либо окну)

возьми на вооружение граф.утилиту WinSight32.exe в составе Делфи и посмотри на искомое окно повнимательней - его имя, уровень и т.д., сравни со своими данными, получаемыми программно

для перечисления верхнеуровневых и дочерних окон в поисках нужного так же можно воспользоваться ф-циями EnumWindows и EnumChildWindows, зачастую они дают лучшие результаты чем FindWindow[Ex]


 
sergeii ©   (2004-07-08 09:42) [11]

Может есть ещё програма которая показивала тоже как и WinSight32.exe только активного окна или тех елемнтов на которые показываеш. Спасибо


 
Digitman ©   (2004-07-08 09:47) [12]


> sergeii ©   (08.07.04 09:42) [11]


есть.

SpyXX.exe - утилита в составе MS VisualStudio


 
sergeii ©   (2004-07-08 09:57) [13]

Удалено модератором
Примечание: Личная переписка


 
Digitman ©   (2004-07-08 11:19) [14]

Удалено модератором
Примечание: Личная переписка


 
sergeii ©   (2004-07-08 11:33) [15]

Так вот ещё сделал фотографии того что у меня получаетса но ни поиму по чему не хорошо. поставил на форму таимер и сделал цикл ожидания появления формы
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;


 
sergeii ©   (2004-07-08 12:23) [16]

И ещё заметил что моя програмка после запуска второго окна перестаёт работать, когда закрываеш ето злощасное второе окно програмка доканчивает работу, что ето может быть


 
Digitman ©   (2004-07-08 12:35) [17]


> а вот пойавляетса вторая форма как моя програмка подвисает.


потому что она крутится в бесконечном цикле

while(FindWindow("TEditPLU", "Edit PLU")=0)do
begin
   form1.Timer1.Interval:=5000;
   label9.Caption:=label9.caption+" 0";
   form1.Timer1.Interval:=0;
end;

условие выхода из цикла - нахождение окна верхнего уровня
значит, окно не найдено, раз цикл бесконечный



Страницы: 1 вся ветка

Текущий архив: 2004.08.22;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.051 c
3-1090929813
Vlad Oshin
2004-07-27 16:03
2004.08.22
Работа без установки BDE


14-1090936185
Сериалоненавистница
2004-07-27 17:49
2004.08.22
Кому нравятся сериалы?


14-1090698815
Marser
2004-07-24 23:53
2004.08.22
Уезжаю!


3-1091113555
}|{yk
2004-07-29 19:05
2004.08.22
AV в модуле gds32.dll


4-1089124563
Buster
2004-07-06 18:36
2004.08.22
Как открыть стандартную панельку со свойствами файла-директории?