|
Вопрос # 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;
- var
- Nm: 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;
- var
- Nm: 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);
- var
- R: 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];
- end
- end;
-
- procedure TForm1.ListView2DblClick(Sender: TObject);
- var
- R: 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] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|