Что нового

GUI поверх рабочего стола при сворачивании всего

Pat4005

Новичок
Сообщения
85
Репутация
4
А можно ли сделать так, чтобы GUI отображался не поверх всех окон, а только поверх рабочего стола при их сворачивании(при Win+D, например)?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Как то так:

Код:
#include <GUIConstantsEx.au3>

Opt("WinWaitDelay", 10)

$hGUI = GUICreate("Test")
GUISetState(@SW_SHOW, $hGUI)

AdlibRegister('_SetOnTopOfDesktop', 10)

While 1
	$nMsg = GUIGetMsg()

	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func _SetOnTopOfDesktop()
	If WinActive("[REGEXPCLASS:^(Progman|WorkerW)$]") Then
		WinActivate($hGUI)
	EndIf
EndFunc
 
Автор
P

Pat4005

Новичок
Сообщения
85
Репутация
4
Да, CreatoR, именно оно, спасибо! :ok:


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

:( Всё было хорошо, пока не обнаружился глюк-невозможно выделить или щелкнуть по элементам рабочего стола, он как будто все время обновляется!
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Pat4005
так и должно быть :smile:
ведь функция
Код:
_SetOnTopOfDesktop()

выполняется постоянно. то есть активность с рабочего стола переводится на окно программы. так что не вариант что то сделать на рабочем столе ;)
 
Автор
P

Pat4005

Новичок
Сообщения
85
Репутация
4
Александр,Я понимаю это. Мне необходимо скорее это: чтобы при каждом сворачивании всех окон, моя программа соответственно каждый такой раз разворачивалась(показывалась). Это можно было бы сделать, если б ф-ция WinMinimizeAll возвращала какие нибудь значения. Нет не так! Если бы о сворачивании всех окон я бы мог как-нибудь узнать..
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Pat4005 [?]
невозможно выделить или щелкнуть по элементам рабочего стола
Замени WinActivate($hGUI) на WinSetState($hGUI, '', @SW_RESTORE).
 
Автор
P

Pat4005

Новичок
Сообщения
85
Репутация
4
CreatoR, работает только БЕЗ стилей для GUI. В общем, вот так НЕ работает:
Код:
#include <WinAPI.au3>
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>


Opt("WinWaitDelay", 10)

$hGUI = GUICreate("Test",150,100,500,300,$WS_POPUP, $WS_EX_TOOLWINDOW+$WS_EX_LAYERED)
GUISetBkColor(0x000001)
GUISetState(@SW_SHOW, $hGUI)
$CMD1 = GUICtrlCreateButton("", 0, 0, 70, 60)
_WinAPI_SetLayeredWindowAttributes($hgui, 0x000001, 0, $LWA_COLORKEY)
AdlibRegister('_SetOnTopOfDesktop', 10)

While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _SetOnTopOfDesktop()
    If WinActive("[REGEXPCLASS:^(Progman|WorkerW)$]") Then
        WinSetState($hGUI, '', @SW_RESTORE)
    EndIf
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Можно попробовать ещё так:

Код:
#include <WinAPI.au3>
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>

$iFlag = 0

Opt("WinWaitDelay", 10)

$hGUI = GUICreate("Test", 150, 100, 500, 300, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_LAYERED))
GUISetBkColor(0x000001)
GUISetState(@SW_SHOW, $hGUI)
$CMD1 = GUICtrlCreateButton("", 0, 0, 70, 60)
_WinAPI_SetLayeredWindowAttributes($hGUI, 0x000001, 0, $LWA_COLORKEY)
AdlibRegister('_SetOnTopOfDesktop', 10)

While 1
    $nMsg = GUIGetMsg()
	
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _SetOnTopOfDesktop()
	If Not WinActive("[REGEXPCLASS:^(Progman|WorkerW)$]") And Not WinActive($hGUI) Then
		$iFlag = 0
	EndIf
	
    If $iFlag = 0 And WinActive("[REGEXPCLASS:^(Progman|WorkerW)$]") Then
		$iFlag = 1
		WinActivate($hGUI)
    EndIf
EndFunc
 

joiner

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

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Pat4005 [?]
работает только БЕЗ стилей для GUI. В общем, вот так НЕ работает
А попробуйте в этом примере в функции _SetOnTopOfDesktop() заменить
Код:
WinSetState($hGUI, '', @SW_RESTORE)

на
Код:
GUISetState(@SW_RESTORE, $hGUI)



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

CreatoR [?]
Можно попробовать ещё так:
На Win7. Если выбрать "Показать рабочий стол" (или нажать Win+D), а после кликнуть в рабочий стол, то окно пропадает.


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

Вот так у меня заработало. И рабочий стол доступен.
Код:
#include <WinAPI.au3>
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>


Opt("WinWaitDelay", 10)

$hGUI = GUICreate("Test",150,100,500,300,$WS_POPUP, $WS_EX_TOOLWINDOW+$WS_EX_LAYERED)
GUISetBkColor(0x000001)
GUISetState(@SW_SHOW, $hGUI)
$CMD1 = GUICtrlCreateButton("", 0, 0, 70, 60)
_WinAPI_SetLayeredWindowAttributes($hgui, 0x000001, 0, $LWA_COLORKEY)
AdlibRegister('_SetOnTopOfDesktop', 10)

While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _SetOnTopOfDesktop()
    If WinActive("[REGEXPCLASS:^(Progman|WorkerW)$]") Then
        WinSetState($hGUI, '', @SW_RESTORE)
        WinSetOnTop($hGUI, '', 1) ; <-- добавлено
        WinSetOnTop($hGUI, '', 0) ; <-- добавлено
    EndIf
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
в функции можно у брать строку
Код:
WinSetState($hGUI, '', @SW_RESTORE)

она все равно в данном коде нерабочая.
еще бы окно по Alt+F4 не закрывалось ..... :smile:
CreatoR [?]
Совсем не тоже самое
я сказал про одинаковость , потому что в первом твоем скрипте и во втором функция приводит к одному действию
Код:
WinActivate($hGUI)

и не важно сколько условий написано перед этим.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Александр [?]
в первом твоем скрипте и во втором функция приводит к одному действию
и не важно сколько условий написано перед этим.
Вот именно что важно, т.к эти условия предотвращают постоянную активность окна на рабочем столе.
 
Автор
P

Pat4005

Новичок
Сообщения
85
Репутация
4
Работает так: при сворачивании опять же сворачивается GUI скрипта, но после нажатия 'Win' появляется! Однако, после следующего нажатия Win появляется окно GUI скрипта и исчезает окно(все гаджеты) Windows SideBar. Но после следующих манипуляций по сворачиванию-разворачиванию всё становится на свои места - при последующих сворачиваниях на рабочем столе ОСТАЮТСЯ Gui нашей программы и как положено SideBar. Это не критично, но довольно интересно! Кстати, я заметил что у SideBar'а кажется такой же механизм действий при сворачивании как и предложил CreatoR, или я ошибаюсь?
 
Автор
P

Pat4005

Новичок
Сообщения
85
Репутация
4
Нашел как обойти небольшие проблемы, описанные мной выше. Это еще одно решение задачи сабжа. Я создал еще одно маленькое окошко 1на1 за пределами экрана(кроме основного gui), и при каждой активации рабочего стола оно послед-но разворачивается и сворачивается, при этом активируется главное окно:
Код:
; поверх только рабочего стола
Func _SetOnTopOfDesktop()
    If WinActive("[REGEXPCLASS:^(Progman|WorkerW)$]") Then
        GUISetState(@SW_SHOW,$EMPTY)
		Sleep(100)
		GUISetState(@SW_HIDE,$EMPTY)
	EndIf
EndFunc
 
Верх