Что нового

[Окна, Диалоги] Разные дескрипторы одного окна

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
использую функцию
Код:
WinGetHandle('[active]')
для получения дескриптора рабочего стола
получаю один дескриптор
пишу по другому
Код:
WinGetHandle('[class:WorkerW]')

получаю другой.
прошу пояснить почему так?
в скрипте мне нужно использовать обе эти строчки.
Windows 7
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
CreatoR
если у тебя семерка, то попробуй запустить вот так
Код:
MsgBox(0,'',WinGetHandle('[active]'))
MsgBox(0,'',WinGetHandle('[class:WorkerW]'))
MsgBox(0,'',WinGetHandle('[CLASS:Progman]'))
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Скрипт был взят с официального форума
Код:
; ===============================================================================================================================
; <_WinGetDesktopHandle.au3>
;
; Function to get the Windows' Desktop Handle.
;   Since this is no longer a simple '[CLASS:Progman]' on Aero-enabled desktops, this method uses a slightly
;   more involved method to find the correct Desktop Handle.
;
; Author: Ascend4nt, credits to Valik for pointing out the Parent->Child relationship: Desktop->'SHELLDLL_DefView'
; ===============================================================================================================================

Func _WinGetDesktopHandle()
    Local $i,$hDeskWin,$hSHELLDLL_DefView,$hListView
    ; The traditional Windows Classname for the Desktop, not always so on newer O/S's
    $hDeskWin=WinGetHandle("[CLASS:Progman]")
    ; Parent->Child relationship: Desktop->SHELLDLL_DefView
    $hSHELLDLL_DefView=ControlGetHandle($hDeskWin,'','[CLASS:SHELLDLL_DefView; INSTANCE:1]')
    ; No luck with finding the Desktop and/or child?
    If $hDeskWin='' Or $hSHELLDLL_DefView='' Then
        ; Look through a list of WorkerW windows - one will be the Desktop on Windows 7+ O/S's
        $aWinList=WinList("[CLASS:WorkerW]")
        For $i=1 To $aWinList[0][0]
            $hSHELLDLL_DefView=ControlGetHandle($aWinList[$i][1],'','[CLASS:SHELLDLL_DefView; INSTANCE:1]')
            If $hSHELLDLL_DefView<>'' Then
                $hDeskWin=$aWinList[$i][1]
                ExitLoop
            EndIf
        Next
    EndIf
    ; Parent->Child relationship: Desktop->SHELDLL_DefView->SysListView32
    $hListView=ControlGetHandle($hSHELLDLL_DefView,'','[CLASS:SysListView32; INSTANCE:1]')
    If $hListView='' Then Return SetError(-1,0,'')
    Return SetExtended($hListView,$hDeskWin)
EndFunc



Добавлено:
Сообщение автоматически объединено:

Если же Explorer не запущен, то дескприптор рабочего стола можно получить через API
Код:
#include <WinApi.au3>
_WinAPI_GetDesktopWindow()
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
скрипт с оф.форума как раз то, что нужно
он выдает тот же дескриптор, что и AutoIT Info.

inververs [?]
Если же Explorer не запущен, то дескприптор рабочего стола можно получить через API
ну в этом случае нужно ремонтировать систему :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
$hDesktop1 = _WinGetDesktopHandle()
$hDesktop2 = WinGetHandle("[CLASS:Progman]")
ConsoleWrite($hDesktop1 & @LF)
ConsoleWrite($hDesktop2 & @LF)

Результат тот же.

Насколько мне известно, Progman всегда вернёт дескриптор рабочего стола.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
_WinAPI_GetShellWindow()
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Браво, как всегда! Если какойто функции нету, посмотрите в WinAPIEx :ok:
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
CreatoR [?]
Насколько мне известно, Progman всегда вернёт дескриптор рабочего стола.
может быть я один такой, но у меня не так. :smile:
Yashied [?]
эта функция возвращает то же самое что и
Код:
WinGetHandle('[CLASS:Progman]')

вобщем, смотрите фото
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
"[ACTIVE]" - активное окно (не имеет к рабочему столу никакого отношения)
"[CLASS:blum:rogman]" или _WinAPI_GetShellWindow() - окно Windows Explorer (рабочий стол)
"[CLASS:WorkerW]" - дочернее для "Progman" окно, которое появляется при использовании активного рабочего стола (динамическая смена обоев) в Windows 7.

Что не так? Если нужен рабочий стол, то используй _WinAPI_GetShellWindow().
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Yashied, на фото Autoit Info показывает дескриптор активного окна. я использовал инструмент Finder Tool . навел на рабочий стол.
то же самое показывает и
Код:
WinGetHandle('[active]')
когда рабочий стол является активным окном.
несовпадение в дескрипторах только на семерке.. в ХР все показания совпадают.

Yashied [?]
"[CLASS:WorkerW]" - дочернее для "Progman" окно, которое появляется при использовании активного рабочего стола (динамическая смена обоев) в Windows 7
то есть если убрать смену обоев дескрипторы во всех случаях будут одинаковы..так?
проверил - так..

Если нужен рабочий стол,
дело в том, что мне нужна реакция на активное окно..в скрипте я хотел учесть тот момент, когда активным окном становится рабочий стол..чтобы скрипт не реагировал на него..
для определения дескриптора активного окна я использую
Код:
WinGetHandle('[active]')

думал что все просто. в ХР да, в семерке - нет.
к примеру такой скрипт
Код:
While 1
$active_win = WinGetHandle('[active]')
$handle_progman = WinGetHandle('[class:Progman]')
If $active_win = $handle_progman Then
	MsgBox(0,'','нет',3)
	Exit
Else
	MsgBox(0,'','да',3)
EndIf
WEnd

скрипт , который привел inververs одинаково (универсально) работает и на ХР и на семерке.
 
Верх