Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.05.2017, 20:30
blaksoft blaksoft вне форума
Прохожий
 
Регистрация: 22.05.2017
Сообщения: 4
Версия Delphi: Delphi7,DelphXE
Репутация: 10
По умолчанию проблема со списком активных окон

доброго дня помогите с решением проблемы. Всегда пользовался кодом
Код:
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  
Старый 22.05.2017, 20:49
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вот такой код работает нормально (включая 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  
Старый 23.05.2017, 08:20
blaksoft blaksoft вне форума
Прохожий
 
Регистрация: 22.05.2017
Сообщения: 4
Версия Delphi: Delphi7,DelphXE
Репутация: 10
По умолчанию

у меня почему то ругается на строку
Код:
 EnumWindows(@AddWindow,LPARAM(listbox1));
что может быть не так
Ответить с цитированием
  #4  
Старый 23.05.2017, 20:13
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Windows подключен?
И как ругается? Какая ошибка?

ЗЫ. Телепаты в отпуске.
Ответить с цитированием
  #5  
Старый 23.05.2017, 20:30
blaksoft blaksoft вне форума
Прохожий
 
Регистрация: 22.05.2017
Сообщения: 4
Версия Delphi: Delphi7,DelphXE
Репутация: 10
По умолчанию

вот полный код
Код:
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  
Старый 23.05.2017, 20:33
blaksoft blaksoft вне форума
Прохожий
 
Регистрация: 22.05.2017
Сообщения: 4
Версия Delphi: Delphi7,DelphXE
Репутация: 10
По умолчанию

а почему один и тот же код скомпелированный на разных версиях делфи ведет себя по разному, на семерке работает безотказно , а на ХЕ3 на некоторые окна выдает ошибки
Ответить с цитированием
  #7  
Старый 23.05.2017, 23:07
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Видимо, всё дело в кодировке сиречь юникоде
Ответить с цитированием
  #8  
Старый 24.05.2017, 05:39
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

М-м-м... я вообще не понимаю как оно скомпилилось.
Фнукция НЕ должна быть членом класса. Там тогда неправильные параметры передаются, т.к. у члена класса есть неявный дополнительный параметр - ссылка на экзепляр класса. См. внимательно мой код.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:10.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter