Проверьте текущее активное окно рабочего стола или нет - PullRequest
3 голосов
/ 23 декабря 2010

Я пытаюсь проверить, является ли текущее активное окно рабочим столом, что-то сделать, я написал код ниже, но значение дескриптора, возвращенное GetDektopWindow & GetForegroundWindow, не совпадает со значением:

  if GetForegroundWindow = GetDesktopWindow then
    // Do something

Как это сделать?

Ответы [ 3 ]

5 голосов
/ 23 декабря 2010
// not defined in D2007
function GetShellWindow: HWND; stdcall; external user32;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if GetForegroundWindow = GetShellWindow then
    [..]
end;

С единственной оболочкой без проводника, которую я использую (sharpe), она терпит неудачу.

Обновление:

Иногда иерархия окон рабочего стола отличается (см. Комментарии Андреаса). Ниже приведен пример Spy ++, когда активирована функция поворота изображения на рабочем столе Windows 7. Некоторое окно «WorkerW» занимает экран, и оно активируется при нажатии на рабочем столе. Так как GetShellWindow возвращает дескриптор Progman, вышеуказанный тест не пройден.

Spy++.png

На этом этапе может показаться разумным проверить, имеет ли переднее окно окно представления по умолчанию оболочки в качестве его непосредственного потомка, однако я видел несколько ссылок, которые указывают, что несколько окон «WorkerW» могут быть вложенными. Поэтому я думаю, что нижеприведенный подход будет более безопасным:

procedure TForm1.Timer1Timer(Sender: TObject);

  function HasDefViewChild(Wnd: HWND): Boolean;
  begin
    Result := Wnd <> 0;
    if Result then begin
      Result := FindWindowEx(Wnd, 0, 'SHELLDLL_DefView', nil) <> 0;
      if not Result then
        Result := HasDefViewChild(FindWindowEx(Wnd, 0, 'WorkerW', nil));
    end;
  end;

begin
  if HasDefViewChild(GetForegroundWindow) then
    [...]
end;

Это будет работать, когда переднее окно - «Progman», потому что тогда «DefView» - это «потомок Progman». OTOH, когда «WorkerW» является активным окном, код будет повторяться, если первый дочерний элемент не «DefView», а вместо этого еще один «WorkerW».

2 голосов
/ 23 декабря 2010

Отличным инструментом для выяснения структуры отношений между родителями и потомками, классами окон и т. Д. Является WinDowse от Greatis Software. http://www.greatis.com/delphicb/windowse/ Я бы начал там. И я бы вывел значения GetForegroundWindow и GetDesktopWindow (и т. Д.) На метки в вашем тестовом приложении. Таким образом, вы можете видеть, что это за значения, пока вы работаете с WinDowse, в режиме реального времени.

0 голосов
/ 24 декабря 2010

Я ищу по этому поводу, GetWindowDesktop возвращает дескриптор окна рабочего стола, но окно рабочего стола находится под другим окном, называемым оболочкой, поэтому, когда вы действительно переключаетесь на dektop, вы переключаетесь на окно оболочки и должны получить дескриптор оболочки, если вы завершаете процесс оболочкиокно (explorer.exe), то вы можете увидеть реальное окно dektop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...