Список открытых окон проводника
От: xteam777  
Дата: 15.03.23 14:42
Оценка:
Доброго времени.
Собственно пытаюсь получить открытые окна проводника. Возникает ошибка при обращении к Item.
Что не так?

Debugger Exception Notification
---------------------------
Project Project4.exe raised exception class $C0000005 with message 'access violation at 0x00c6fd3c: read of address 0x00000000'.
---------------------------
Break Continue Copy Help
---------------------------


uses SHDocVw;

Function GetCurrentExplorerDirectory: String;
var
  ShellWindows: IShellWindows;
  i: Integer;
  h: HWND;
begin
  Result := '';

  {Explorer - глобальная переменная для доступа ко всем откр.окнам Explorer}
  ShellWindows := CoShellWindows.Create;

  {Цикл прохода по всем откр.в настоящий момент окнам Explorer}
  for i := 0 to ShellWindows.Count - 1 do
    {Если очередное окно пребывает сейчас в фокусе}
    if GetForegroundWindow = (ShellWindows.Item(i) as IWebbrowser2).HWND then <----------------------------------- ВОТ ТУТ ОШИБКА
    begin
      {Получаем его Handle (дескриптор окна) }
      h := (ShellWindows.Item(i) as IWebbrowser2).HWND; 
    end;
end;
Отредактировано 15.03.2023 14:48 xteam777 . Предыдущая версия . Еще …
Отредактировано 15.03.2023 14:44 xteam777 . Предыдущая версия .
Re: Список открытых окон проводника
От: Aniskin  
Дата: 15.03.23 19:03
Оценка: +2
Здравствуйте, xteam777, Вы писали:

Поток вызывает CoInitializeEx?
Re: Список открытых окон проводника
От: Mr.Delphist  
Дата: 16.07.23 16:37
Оценка:
Здравствуйте, xteam777, Вы писали:

X>Доброго времени.

X>Собственно пытаюсь получить открытые окна проводника. Возникает ошибка при обращении к Item.
X>Что не так?

Сталкивался с ситуацией, что некоторые давно не получавшие фокуса окна теряют часть GDI-функций (например, захват содержимого), пока снова не появятся в фокусе.
Re: Список открытых окон проводника
От: Pzz Россия https://github.com/alexpevzner
Дата: 16.07.23 17:02
Оценка:
Здравствуйте, xteam777, Вы писали:

X>Project Project4.exe raised exception class $C0000005 with message 'access violation at 0x00c6fd3c: read of address 0x00000000'.


Выглядит, как NULL pointer dereference.

X>
X>    if GetForegroundWindow = (ShellWindows.Item(i) as IWebbrowser2).HWND then <----------------------------------- ВОТ ТУТ ОШИБКА
X>


Насколько уж я паскаля не знаю, но тут вроде или ShellWindows может быть NULL, или Item(i) от него, в который ты лезешь за HWND. Вот и проверь их явно. В паскале хоть есть, чем на значение указателя посмотреть?

И еще. А разве в паскале индексация массивов идет от 0, а не от 1?
Re[2]: Список открытых окон проводника
От: CRT  
Дата: 17.07.23 17:57
Оценка:
Здравствуйте, Pzz, Вы писали:


Pzz>И еще. А разве в паскале индексация массивов идет от 0, а не от 1?


в паскале индексация идет с чего хочешь
например
temperature = array [-10 .. 50] of real;

а ShellWindows.Item() это не массив а метод, и с чего у него там индексация идет, надо смотреть в доках. Скорей всего с нуля
Re: Список открытых окон проводника
От: Разраб  
Дата: 18.07.23 11:17
Оценка:
Здравствуйте, xteam777, Вы писали:
X> if GetForegroundWindow = (ShellWindows.Item(i) as IWebbrowser2).HWND then <----------------------------------- ВОТ ТУТ ОШИБКА
Думаю кастинг к IWebbrowser2 неудачный, вынесите ShellWindows.Item(i) as IWebbrowser2 в переменную и проверяйте на nil или как там в дельфи
☭ ✊ В мире нет ничего, кроме движущейся материи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.