| 
| 
 | Вопрос # 3 349/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты!Подскажите пожалуйста.Программа ищет все родительские окна,затем по двойному клику на окне она показывает картинку окна на отдельной форме.Затем ищет дочерние окна у заданного родительского окна,находит,далее при двойном клике должна показать картинку элемента этого окна и вот здесь начинает косячить: показывает форму для вывода картинки или полностью свернутой(без клиентской части)или пустой,хотя окно видимо и элементы тоже.Код плный и EXE прилагаются
 К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса) Приложение:Переключить в обычный режим unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, ComCtrls, StdCtrls,ShellApi, ImgList,FileCtrl,Menus; type  TForm1 = class(TForm)    ListView1: TListView;    Button1: TButton;    Label1: TLabel;    Label2: TLabel;    Label3: TLabel;    Edit1: TEdit;    Edit2: TEdit;    Edit3: TEdit;    Label4: TLabel;    ListView2: TListView;    Button2: TButton;    Button3: TButton;    BalloonHint1: TBalloonHint;    ImageList1: TImageList;    procedure GetAllWindow;    procedure Button1Click(Sender: TObject);    procedure ListView1DblClick(Sender: TObject);    procedure ListView1Click(Sender: TObject);    procedure FormCreate(Sender: TObject);    procedure GetSubChild;    procedure Button3Click(Sender: TObject);    procedure Button2Click(Sender: TObject);    procedure ListView2Click(Sender: TObject);    procedure ListView2DblClick(Sender: TObject);    procedure ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,      Y: Integer);    procedure ListView2MouseMove(Sender: TObject; Shift: TShiftState; X,      Y: Integer);  private    { Private declarations }  public    { Public declarations }  end; var  Form1: TForm1; implementation uses Unit3, Unit2;{$R *.dfm}var WDD:HDC;function EnumProc(Wd: HWnd;Param: LongInt):Boolean;stdcall;varNm: Array[0..255] of Char;Cs: Array[0..255] of Char;begin  GetWindowText(Wd,Nm,255);  GetClassName(Wd,Cs,255);  if (WD<>Form1.Handle) or (WD<>Form3.Handle) then  with Form1.ListView1.Items.Add do   begin     SubItems.Add(string(Nm));     SubItems.Add(string(Cs));     SubItems.Add(IntToStr(Wd));   end;   EnumProc:= True;end;  function EnumProc1(WD: HWnd;Param: LongInt):Boolean;stdcall;varNm: Array[0..255] of Char;Cs: Array[0..255] of Char;begin  GetWindowText(Wd,Nm,255);  GetClassName(Wd,Cs,255);  if (WD<>Form1.Handle) or (WD<>Form3.Handle) then  with Form1.ListView2.Items.Add do   begin     SubItems.Add(string(Nm));     SubItems.Add(string(Cs));     SubItems.Add(IntToStr(Wd));   end;   EnumProc1:= True;end;{ TForm1 } procedure TForm1.Button1Click(Sender: TObject);begin  Form1.GetAllWindow;   ListView1.Visible:= True;  ListView2.Visible:= False;  Button1.Visible:= False;  Button3.Visible:= True;end;   procedure TForm1.Button2Click(Sender: TObject);begin  ListView1.Visible:= True;  ListView2.Visible:= False;  Button1.Visible:= True;  Button3.Visible:= False;  Edit1.Clear;  Edit2.Clear;  Edit3.Clear;end; procedure TForm1.Button3Click(Sender: TObject);begin  if ListView1.SelCount = 0 then   begin     end   else   begin  Form1.GetSubChild;  ListView1.Visible:= False;  ListView2.Visible:= True;  Edit1.Clear;  Edit2.Clear;  Edit3.Clear;end;end;  procedure TForm1.FormCreate(Sender: TObject);begin  ListView1.Visible:= True;  ListView2.Visible:= False;  Button1.Visible:= True;  Button3.Visible:= False;end;  procedure TForm1.GetAllWindow;begin ListView1.Items.Clear; EnumWindows(@EnumProc,0);end;  procedure TForm1.GetSubChild;begin ListView2.Items.Clear; EnumChildWindows(WDD,@EnumProc1,0);end; procedure TForm1.ListView1Click(Sender: TObject);begin  if ListView1.SelCount = 0 then   begin     end   else   begin  WDD:= FindWindow(PChar(ListView1.Selected.SubItems[1]),nil);  Edit1.Text:= ListView1.Selected.SubItems[0];  Edit2.Text:= ListView1.Selected.SubItems[1];  Edit3.Text:= ListView1.Selected.SubItems[2];   end;end; procedure TForm1.ListView1DblClick(Sender: TObject);varR: TRect;WinDC: HDC;begin  if ListView1.SelCount = 0 then   begin     end   else   begin     Form3.Show;     SetForegroundWindow(WDD);     Sleep(50);     GetWindowRect(WDD,R);     WinDC:= GetWindowDC(WDD);     Form3.SetBounds(0,0,R.Right-R.Left,R.Bottom-R.Top);     BitBlt(Form3.Canvas.Handle,0,0,Form3.Width,Form3.Height,WinDC,0,0,SRCCOPY);   end;end; procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,  Y: Integer);begin end; procedure TForm1.ListView2Click(Sender: TObject);begin  if ListView2.SelCount = 0 then   begin     end   else   begin  Edit1.Text:= ListView2.Selected.SubItems[0];  Edit2.Text:= ListView2.Selected.SubItems[1];  Edit3.Text:= ListView2.Selected.SubItems[2];   endend; procedure TForm1.ListView2DblClick(Sender: TObject);varR: TRect;WinDC: HDC;CW: HDC;begin  if ListView2.SelCount = 0 then   begin     end   else   begin     CW:=
FindWindowEx(WDD,0,PChar(ListView2.Selected.SubItems[1]),PChar(ListView2.Selected.SubItems[0]));     SetForegroundWindow(CW);     Sleep(50);     GetWindowRect(CW,R);     WinDC:= GetWindowDC(CW);     Form3.SetBounds(0,0,R.Right-R.Left,R.Bottom-R.Top);     BitBlt(Form3.Canvas.Handle,0,0,Form3.Width,Form3.Height,WinDC,0,0,SRCCOPY);     Form3.Show;   end;end; procedure TForm1.ListView2MouseMove(Sender: TObject; Shift: TShiftState; X,  Y: Integer);begin end; end.
|  |   Вопрос задал: igoriy (статус: Посетитель)Вопрос отправлен: 2 ноября 2009, 09:15
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 25; последнее сообщение — 2 ноября 2009, 13:46; участников в обсуждении: 4. Страницы: [1] [2] [Следующая »]  
|   | min@y™ (статус: Доктор наук), 2 ноября 2009, 09:55 [#1]:Ой, как же неохота копать чужие исходники, особенно с именами контролов по умолчанию (ListView1, Button1, Edit1, Form1). Под отладчиком смотрел? Чему, например, равен R посде вызова GetWindowRect(WDD,R);?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | igoriy (статус: Посетитель), 2 ноября 2009, 10:03 [#2]:Суть в том что с родительским то же самое работает нормально |  
|   | min@y™ (статус: Доктор наук), 2 ноября 2009, 10:12 [#3]: Цитата (igoriy): Суть в том что с родительским то же самое работает нормально  
 Действительно, нафига мне отладчик? Лучше пойду на форуме спрошу, пусть народ поищет мои ошибки и исправит их, а я пока пивка попью.
 
 Отладчик нужен, в том числе, и для поиска причин неверного поведения программы.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | igoriy (статус: Посетитель), 2 ноября 2009, 10:25 [#4]:Да ни хочу я перекладывать на других свои проблемы,просто,стыдно признаться,не умею я им пользоваться как надо:Все делаю по книге,ставлю курсор на процедуру,вписываю переменную,F7, а он не заходит в нее и все тут |  
|   | igoriy (статус: Посетитель), 2 ноября 2009, 10:32 [#5]:Вернее F4 нажимаю и он не пошагово а всю сразу процедуру пробегает |  
|   | min@y™ (статус: Доктор наук), 2 ноября 2009, 10:33 [#6]:Поставь курсор на строку, рядом с которой есть синяя точка. Эта точка обозначает исполнимую строку. Нажми F5 - появится точка останова (брейкпойнт). Если она красная, значит всё ок, запускай прогу. Как только прога остановится в этом месте, можно будет посмотреть (и даже изменить) значения переменных и пройтись по куску программы по шагам (F8, F7). Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | igoriy (статус: Посетитель), 2 ноября 2009, 10:40 [#7]:Watch Name	Value R	(515, 1, 77, 1244704, (515, 1), (77, 1244704))вот это у R; Спасибо что пользоваться научил
 |  
|   | min@y™ (статус: Доктор наук), 2 ноября 2009, 10:42 [#8]:F4 - это "выполнить до курсора" Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | min@y™ (статус: Доктор наук), 2 ноября 2009, 10:43 [#9]: Цитата (igoriy): Спасибо что пользоваться научил  
 Спасибо - это много. Пива достаточно.
   Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | igoriy (статус: Посетитель), 2 ноября 2009, 10:45 [#10]:Только без помощи разобраться всеравно не могу,почему чтото в скобочках, а что то без?Причем окно выбрано одно,значит и результаты должны быть одни,а цифры меняются с каждым шагом? |  
|   | igoriy (статус: Посетитель), 2 ноября 2009, 10:47 [#11]:Кстати во книги пишут,она передо мной и там черным по белому:F4 - от курсора |  
|   | min@y™ (статус: Доктор наук), 2 ноября 2009, 10:54 [#12]: Цитата (igoriy): почему чтото в скобочках, а что то без? 
 
 type 
  TRect = packed record
  case Integer of
    0: (Left, Top, Right, Bottom: Integer);
    1: (TopLeft, BottomRight: TPoint);
  end;R (515, // <--- Left
 1, // <--- Тор
 77, // <--- Right
 1244704, // <--- Bottom
 (515, 1), // <--- TopLeft
 (77, 1244704)) // <--- BottomRight
 
 
 Цитата (igoriy): результаты должны быть одни,а цифры меняются с каждым шагом 
 Дык на этих шагах R меняется. Например, функция GetWindowRect заносит туда значения.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | min@y™ (статус: Доктор наук), 2 ноября 2009, 10:57 [#13]: Цитата (igoriy): Кстати во книги пишут,она передо мной и там черным по белому:F4 - от курсора  
 Отнеси эту книгу себе в сортир и оставь там на случай внезапного отсутствия туалетной бумаги. А теперь нажми в Delphi меню "Run" и убедись, что F4 - это "Run to cursor".
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | igoriy (статус: Посетитель), 2 ноября 2009, 11:01 [#14]:Блин тебе учебники надо писать- все ответы доходчивые дальше не куда,а пишут их(учебники)другие(понятно кто) |  
|   | igoriy (статус: Посетитель), 2 ноября 2009, 11:05 [#15]:Так у меня тогда получается,что R.Right-R.Left отрицательное, а почему, ведь Left у окна меньше должно быть?
 |  
|   | Жикльор (статус: 5-ый класс), 2 ноября 2009, 11:34 [#16]:Left - это расстояние в пикселях от левого края окна к левому краю окна твоей программы. Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию. |  
|   | min@y™ (статус: Доктор наук), 2 ноября 2009, 11:45 [#17]: Цитата (igoriy): Так у меня тогда получается,что R.Right-R.Left отрицательное, а почему, ведь Left у окна меньше должно быть?  
 Это до или после вызова GetWindowsRect()?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | igoriy (статус: Посетитель), 2 ноября 2009, 11:45 [#18]:Дошло до меня,но тогда надо использовать вместо GetWindowRect(CW,R)-GetClientRect(CW,R), но при его использовании компилятор говорит что указаны не все параметры,хотя по справочнику все |  
|   | igoriy (статус: Посетитель), 2 ноября 2009, 11:47 [#19]:min@y™ после вызова |  
|   | min@y™ (статус: Доктор наук), 2 ноября 2009, 12:14 [#20]: Цитата (igoriy): после вызова  
 Уверен, что курсор стоит на строке "WinDC:= GetWindowDC(WDD);", т.е. именно после вызова GetWindowRect(), а не на самой GetWindowRect(), когда ты смотришь значение R?
 
 
 Цитата (igoriy): GetWindowRect(CW,R)-GetClientRect(CW,R) 
 Это чо за бред?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Страницы: [1] [2] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |