Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 349

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Подскажите пожалуйста.Программа ищет все родительские окна,затем по двойному клику на окне она показывает картинку окна на отдельной форме.Затем ищет дочерние окна у заданного родительского окна,находит,далее при двойном клике должна показать картинку элемента этого окна и вот здесь начинает косячить: показывает форму для вывода картинки или полностью свернутой(без клиентской части)или пустой,хотя окно видимо и элементы тоже.Код плный и EXE прилагаются

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, ComCtrls, StdCtrls,ShellApi, ImgList,FileCtrl,Menus;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. ListView1: TListView;
  12. Button1: TButton;
  13. Label1: TLabel;
  14. Label2: TLabel;
  15. Label3: TLabel;
  16. Edit1: TEdit;
  17. Edit2: TEdit;
  18. Edit3: TEdit;
  19. Label4: TLabel;
  20. ListView2: TListView;
  21. Button2: TButton;
  22. Button3: TButton;
  23. BalloonHint1: TBalloonHint;
  24. ImageList1: TImageList;
  25. procedure GetAllWindow;
  26. procedure Button1Click(Sender: TObject);
  27. procedure ListView1DblClick(Sender: TObject);
  28. procedure ListView1Click(Sender: TObject);
  29. procedure FormCreate(Sender: TObject);
  30. procedure GetSubChild;
  31. procedure Button3Click(Sender: TObject);
  32. procedure Button2Click(Sender: TObject);
  33. procedure ListView2Click(Sender: TObject);
  34. procedure ListView2DblClick(Sender: TObject);
  35. procedure ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
  36. Y: Integer);
  37. procedure ListView2MouseMove(Sender: TObject; Shift: TShiftState; X,
  38. Y: Integer);
  39. private
  40. { Private declarations }
  41. public
  42. { Public declarations }
  43. end;
  44.  
  45. var
  46. Form1: TForm1;
  47.  
  48. implementation
  49. uses Unit3, Unit2;
  50. {$R *.dfm}
  51. var
  52. WDD:HDC;
  53. function EnumProc(Wd: HWnd;Param: LongInt):Boolean;stdcall;
  54. var
  55. Nm: Array[0..255] of Char;
  56. Cs: Array[0..255] of Char;
  57. begin
  58. GetWindowText(Wd,Nm,255);
  59. GetClassName(Wd,Cs,255);
  60. if (WD<>Form1.Handle) or (WD<>Form3.Handle) then
  61. with Form1.ListView1.Items.Add do
  62. begin
  63. SubItems.Add(string(Nm));
  64. SubItems.Add(string(Cs));
  65. SubItems.Add(IntToStr(Wd));
  66. end;
  67. EnumProc:= True;
  68. end;
  69.  
  70.  
  71. function EnumProc1(WD: HWnd;Param: LongInt):Boolean;stdcall;
  72. var
  73. Nm: Array[0..255] of Char;
  74. Cs: Array[0..255] of Char;
  75. begin
  76. GetWindowText(Wd,Nm,255);
  77. GetClassName(Wd,Cs,255);
  78. if (WD<>Form1.Handle) or (WD<>Form3.Handle) then
  79. with Form1.ListView2.Items.Add do
  80. begin
  81. SubItems.Add(string(Nm));
  82. SubItems.Add(string(Cs));
  83. SubItems.Add(IntToStr(Wd));
  84. end;
  85. EnumProc1:= True;
  86. end;
  87. { TForm1 }
  88.  
  89. procedure TForm1.Button1Click(Sender: TObject);
  90. begin
  91. Form1.GetAllWindow;
  92.  
  93. ListView1.Visible:= True;
  94. ListView2.Visible:= False;
  95. Button1.Visible:= False;
  96. Button3.Visible:= True;
  97. end;
  98.  
  99.  
  100.  
  101. procedure TForm1.Button2Click(Sender: TObject);
  102. begin
  103. ListView1.Visible:= True;
  104. ListView2.Visible:= False;
  105. Button1.Visible:= True;
  106. Button3.Visible:= False;
  107. Edit1.Clear;
  108. Edit2.Clear;
  109. Edit3.Clear;
  110. end;
  111.  
  112. procedure TForm1.Button3Click(Sender: TObject);
  113. begin
  114. if ListView1.SelCount = 0 then
  115. begin
  116.  
  117.  
  118. end
  119. else
  120. begin
  121. Form1.GetSubChild;
  122. ListView1.Visible:= False;
  123. ListView2.Visible:= True;
  124. Edit1.Clear;
  125. Edit2.Clear;
  126. Edit3.Clear;
  127. end;
  128. end;
  129.  
  130.  
  131. procedure TForm1.FormCreate(Sender: TObject);
  132. begin
  133. ListView1.Visible:= True;
  134. ListView2.Visible:= False;
  135. Button1.Visible:= True;
  136. Button3.Visible:= False;
  137. end;
  138.  
  139.  
  140. procedure TForm1.GetAllWindow;
  141. begin
  142. ListView1.Items.Clear;
  143. EnumWindows(@EnumProc,0);
  144. end;
  145.  
  146.  
  147. procedure TForm1.GetSubChild;
  148. begin
  149. ListView2.Items.Clear;
  150. EnumChildWindows(WDD,@EnumProc1,0);
  151. end;
  152.  
  153. procedure TForm1.ListView1Click(Sender: TObject);
  154. begin
  155. if ListView1.SelCount = 0 then
  156. begin
  157.  
  158.  
  159. end
  160. else
  161. begin
  162. WDD:= FindWindow(PChar(ListView1.Selected.SubItems[1]),nil);
  163. Edit1.Text:= ListView1.Selected.SubItems[0];
  164. Edit2.Text:= ListView1.Selected.SubItems[1];
  165. Edit3.Text:= ListView1.Selected.SubItems[2];
  166. end;
  167. end;
  168.  
  169. procedure TForm1.ListView1DblClick(Sender: TObject);
  170. var
  171. R: TRect;
  172. WinDC: HDC;
  173. begin
  174. if ListView1.SelCount = 0 then
  175. begin
  176.  
  177.  
  178. end
  179. else
  180. begin
  181. Form3.Show;
  182. SetForegroundWindow(WDD);
  183. Sleep(50);
  184. GetWindowRect(WDD,R);
  185. WinDC:= GetWindowDC(WDD);
  186. Form3.SetBounds(0,0,R.Right-R.Left,R.Bottom-R.Top);
  187. BitBlt(Form3.Canvas.Handle,0,0,Form3.Width,Form3.Height,WinDC,0,0,SRCCOPY);
  188. end;
  189. end;
  190.  
  191. procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
  192. Y: Integer);
  193. begin
  194.  
  195. end;
  196.  
  197. procedure TForm1.ListView2Click(Sender: TObject);
  198. begin
  199. if ListView2.SelCount = 0 then
  200. begin
  201.  
  202.  
  203. end
  204. else
  205. begin
  206. Edit1.Text:= ListView2.Selected.SubItems[0];
  207. Edit2.Text:= ListView2.Selected.SubItems[1];
  208. Edit3.Text:= ListView2.Selected.SubItems[2];
  209. end
  210. end;
  211.  
  212. procedure TForm1.ListView2DblClick(Sender: TObject);
  213. var
  214. R: TRect;
  215. WinDC: HDC;
  216. CW: HDC;
  217. begin
  218. if ListView2.SelCount = 0 then
  219. begin
  220.  
  221.  
  222. end
  223. else
  224. begin
  225. CW:= FindWindowEx(WDD,0,PChar(ListView2.Selected.SubItems[1]),PChar(ListView2.Selected.SubItems[0]));
  226. SetForegroundWindow(CW);
  227. Sleep(50);
  228. GetWindowRect(CW,R);
  229. WinDC:= GetWindowDC(CW);
  230. Form3.SetBounds(0,0,R.Right-R.Left,R.Bottom-R.Top);
  231. BitBlt(Form3.Canvas.Handle,0,0,Form3.Width,Form3.Height,WinDC,0,0,SRCCOPY);
  232. Form3.Show;
  233. end;
  234. end;
  235.  
  236. procedure TForm1.ListView2MouseMove(Sender: TObject; Shift: TShiftState; X,
  237. Y: Integer);
  238. begin
  239.  
  240. end;
  241.  
  242. end.


igoriy Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: igoriy (статус: Посетитель)
Вопрос отправлен: 2 ноября 2009, 09:15
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 25; последнее сообщение — 2 ноября 2009, 13:46; участников в обсуждении: 4.

Страницы: [1] [2] [Следующая »]

min@y™

min@y™ (статус: Доктор наук), 2 ноября 2009, 09:55 [#1]:

Ой, как же неохота копать чужие исходники, особенно с именами контролов по умолчанию (ListView1, Button1, Edit1, Form1).
Под отладчиком смотрел? Чему, например, равен R посде вызова GetWindowRect(WDD,R);?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
igoriy

igoriy (статус: Посетитель), 2 ноября 2009, 10:03 [#2]:

Суть в том что с родительским то же самое работает нормально
min@y™

min@y™ (статус: Доктор наук), 2 ноября 2009, 10:12 [#3]:

Цитата (igoriy):

Суть в том что с родительским то же самое работает нормально


Действительно, нафига мне отладчик? Лучше пойду на форуме спрошу, пусть народ поищет мои ошибки и исправит их, а я пока пивка попью.

Отладчик нужен, в том числе, и для поиска причин неверного поведения программы.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
igoriy

igoriy (статус: Посетитель), 2 ноября 2009, 10:25 [#4]:

Да ни хочу я перекладывать на других свои проблемы,просто,стыдно признаться,не умею я им пользоваться как надо:Все делаю по книге,ставлю курсор на процедуру,вписываю переменную,F7, а он не заходит в нее и все тут
igoriy

igoriy (статус: Посетитель), 2 ноября 2009, 10:32 [#5]:

Вернее F4 нажимаю и он не пошагово а всю сразу процедуру пробегает
min@y™

min@y™ (статус: Доктор наук), 2 ноября 2009, 10:33 [#6]:

Поставь курсор на строку, рядом с которой есть синяя точка. Эта точка обозначает исполнимую строку. Нажми F5 - появится точка останова (брейкпойнт). Если она красная, значит всё ок, запускай прогу. Как только прога остановится в этом месте, можно будет посмотреть (и даже изменить) значения переменных и пройтись по куску программы по шагам (F8, F7).
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
igoriy

igoriy (статус: Посетитель), 2 ноября 2009, 10:40 [#7]:

Watch Name Value
R (515, 1, 77, 1244704, (515, 1), (77, 1244704))вот это у R; Спасибо что пользоваться научил
min@y™

min@y™ (статус: Доктор наук), 2 ноября 2009, 10:42 [#8]:

F4 - это "выполнить до курсора"
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 2 ноября 2009, 10:43 [#9]:

Цитата (igoriy):

Спасибо что пользоваться научил


Спасибо - это много. Пива достаточно. :)
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
igoriy

igoriy (статус: Посетитель), 2 ноября 2009, 10:45 [#10]:

Только без помощи разобраться всеравно не могу,почему чтото в скобочках, а что то без?Причем окно выбрано одно,значит и результаты должны быть одни,а цифры меняются с каждым шагом?
igoriy

igoriy (статус: Посетитель), 2 ноября 2009, 10:47 [#11]:

Кстати во книги пишут,она передо мной и там черным по белому:F4 - от курсора
min@y™

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™

min@y™ (статус: Доктор наук), 2 ноября 2009, 10:57 [#13]:

Цитата (igoriy):

Кстати во книги пишут,она передо мной и там черным по белому:F4 - от курсора


Отнеси эту книгу себе в сортир и оставь там на случай внезапного отсутствия туалетной бумаги. А теперь нажми в Delphi меню "Run" и убедись, что F4 - это "Run to cursor".
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
igoriy

igoriy (статус: Посетитель), 2 ноября 2009, 11:01 [#14]:

Блин тебе учебники надо писать- все ответы доходчивые дальше не куда,а пишут их(учебники)другие(понятно кто)
igoriy

igoriy (статус: Посетитель), 2 ноября 2009, 11:05 [#15]:

Так у меня тогда получается,что R.Right-R.Left отрицательное,
а почему, ведь Left у окна меньше должно быть?
Жикльор

Жикльор (статус: 5-ый класс), 2 ноября 2009, 11:34 [#16]:

Left - это расстояние в пикселях от левого края окна к левому краю окна твоей программы.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
min@y™

min@y™ (статус: Доктор наук), 2 ноября 2009, 11:45 [#17]:

Цитата (igoriy):

Так у меня тогда получается,что R.Right-R.Left отрицательное, а почему, ведь Left у окна меньше должно быть?


Это до или после вызова GetWindowsRect()?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
igoriy

igoriy (статус: Посетитель), 2 ноября 2009, 11:45 [#18]:

Дошло до меня,но тогда надо использовать вместо GetWindowRect(CW,R)-GetClientRect(CW,R), но при его использовании компилятор говорит что указаны не все параметры,хотя по справочнику все
igoriy

igoriy (статус: Посетитель), 2 ноября 2009, 11:47 [#19]:

min@y™ после вызова
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] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:52
Выполнено за 0.03 сек.