![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
М-м-м... я вообще не понимаю как оно скомпилилось.
Фнукция НЕ должна быть членом класса. Там тогда неправильные параметры передаются, т.к. у члена класса есть неявный дополнительный параметр - ссылка на экзепляр класса. См. внимательно мой код. |