|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
проблема со списком активных окон
доброго дня помогите с решением проблемы. Всегда пользовался кодом
Код:
var Wnd: hWnd; buff: array [0..127] of Char; begin ListBox1.Clear; Wnd := GetWindow(Handle, gw_HWndFirst); while Wnd <> 0 do begin {Не показываем:} if (Wnd <> Application.Handle) and {Собственное окно} IsWindowVisible(Wnd) and {Невидимые окна} (GetWindow(Wnd, gw_Owner) = 0) and {Дочерние окна} (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) {Окна без заголовков} then begin GetWindowText(Wnd, buff, sizeof(buff)); ListBox1.Items.Add(StrPas(buff)); end; Wnd := GetWindow(Wnd, gw_hWndNext); end; ListBox1.ItemIndex := 0; end; для получения списка окон все было в порядке пока пользовался делфи7, а когда перешел на делфи ХЕ3 стала выскакивать ошибка на некоторые окна которые открываются через хром вот ссылка с которой программка не работает https://www.edimdoma.ru/retsepty/609...-klassicheskiy и сама ошибка Имя события проблемы: APPCRASH Имя приложения: Project1.exe Версия приложения: 1.0.0.0 Отметка времени приложения: 591d2e5b Имя модуля с ошибкой: Project1.exe Версия модуля с ошибкой: 1.0.0.0 Отметка времени модуля с ошибкой: 591d2e5b Код исключения: c0000005 Смещение исключения: 00280043 Версия ОС: 6.1.7601.2.1.0.256.1 Код языка: 1049 Дополнительные сведения 1: 6e9b Дополнительные сведения 2: 6e9b2908a11fdeac57b414324c93c443 Дополнительные сведения 3: 6927 Дополнительные сведения 4: 6927c94b690cc5d09842633c22b3ddbf что может быть не так |
#2
|
|||
|
|||
Вот такой код работает нормально (включая 64 bit на XE3):
Код:
function AddWindow(AHandle : THandle; ListBox : LPARAM) : BOOL; stdcall; var FWndInfo : TWndInfo; AText : String; PText : Array [0..1023] Of Char; begin If (AHandle <> Application.Handle) And (AHandle <> Application.MainForm.Handle) And (IsWindowVisible(AHandle)) And (GetWindow(AHandle, GW_OWNER) = 0) And (IsWindow(AHandle)) Then Begin FillChar(PText,Length(PText) * SizeOf(Char),#0); GetWindowText(AHandle,@PText,1023); AText := StrPas(PText); If (AText <> '') And (AText <> 'Program Manager') Then Begin FWndInfo := TWndInfo.Create(AHandle,AText); TListBox(ListBox).Items.AddObject(AText,FWndInfo); End; End; Result := TRUE; end; { TMainForm } procedure TMainForm.GetWindowsList; var I : Integer; begin lbWindows.Items.BeginUpdate; Try // Clear For I := 0 To lbWindows.Items.Count-1 Do lbWindows.Items.Objects[i].Free; lbWindows.Items.Clear; lbWindows.Sorted := False; // Get new list EnumWindows(@AddWindow,LPARAM(lbWindows)); If lbWindows.Items.Count > 0 Then lbWindows.ItemIndex := 0; lbWindows.Sorted := FPreferences.SortOrder = soAlpha; Finally lbWindows.Items.EndUpdate; End; end; В TWndInfo ничего интересного нет, просто объект для сохранения информации об окне. lbWindows - собтвенно TListBox для вывода списка окон. Последний раз редактировалось lmikle, 22.05.2017 в 20:52. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
blaksoft (23.05.2017)
|
#3
|
|||
|
|||
у меня почему то ругается на строку
Код:
EnumWindows(@AddWindow,LPARAM(listbox1)); |
#4
|
|||
|
|||
Windows подключен?
И как ругается? Какая ошибка? ЗЫ. Телепаты в отпуске. |
#5
|
|||
|
|||
вот полный код
Код:
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,WndInfo; type TForm1 = class(TForm) lbWindows: TListBox; Button1: TButton; procedure Button1Click(Sender: TObject); private function AddWindow(AHandle : THandle; ListBox : LPARAM) : BOOL; stdcall; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} { TForm1 } function TForm1.AddWindow(AHandle: THandle; ListBox: LPARAM): BOOL; var FWndInfo : TWndInfo; AText : String; PText : Array [0..1023] Of Char; begin If (AHandle <> Application.Handle) And (AHandle <> Application.MainForm.Handle) And (IsWindowVisible(AHandle)) And (GetWindow(AHandle, GW_OWNER) = 0) And (IsWindow(AHandle)) Then Begin FillChar(PText,Length(PText) * SizeOf(Char),#0); GetWindowText(AHandle,@PText,1023); AText := StrPas(PText); If (AText <> '') And (AText <> 'Program Manager') Then Begin FWndInfo := TWndInfo.Create(AHandle,AText); TListBox(ListBox).Items.AddObject(AText,FWndInfo); End; End; Result := TRUE; end; procedure TForm1.Button1Click(Sender: TObject); var I : Integer; begin lbWindows.Items.BeginUpdate; Try //Clear For I := 0 To lbWindows.Items.Count-1 Do lbWindows.Items.Objects[i].Free; lbWindows.Items.Clear; // Get new list EnumWindows(@AddWindow,LPARAM(lbWindows)); If lbWindows.Items.Count > 0 Then lbWindows.ItemIndex := 0; lbWindows.Sorted := FPreferences.SortOrder = soAlpha; Finally lbWindows.Items.EndUpdate; End; end; end. |
#6
|
|||
|
|||
а почему один и тот же код скомпелированный на разных версиях делфи ведет себя по разному, на семерке работает безотказно , а на ХЕ3 на некоторые окна выдает ошибки
|
#7
|
||||
|
||||
Видимо, всё дело в кодировке сиречь юникоде
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#8
|
|||
|
|||
М-м-м... я вообще не понимаю как оно скомпилилось.
Фнукция НЕ должна быть членом класса. Там тогда неправильные параметры передаются, т.к. у члена класса есть неявный дополнительный параметр - ссылка на экзепляр класса. См. внимательно мой код. |