Что нового

[Мышь, клавиатура] Как запретить скрипту сворачиваться при win + d ?

Статус
Закрыто для дальнейших ответов.

neumexa

Новичок
Сообщения
6
Репутация
0
Как сделать, что бы при нажатие win + d, все окна как положено сворачивались, а скрипт нет, при этом скрипт не должен быть по верх всех окон.

Нашел вот такой вариант, но win 10 это не работает.
Код:
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>

Global $hDesktop = ControlGetHandle("[CLASS:Progman]", "", "SysListView321")
Global $hGui = GUICreate("Non Minimizable", 500, 500, -1, -1, $WS_MAXIMIZEBOX)
_WinAPI_SetWindowLong($hGui, $GWL_HWNDPARENT, $hDesktop)

GUISetState()

Do
Until GUIGetMsg() = -3
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
[info border=#0000ff float=left]neumexa
1. Во-первых вы ошиблись разделом вам сюда Стол заказов
2. Оформите тему согласно правилам раздела "Стол заказов" и модератор данного раздела перенесёт её.

С уважением, ваш Модератор.[/info]
 
Автор
neumexa

neumexa

Новичок
Сообщения
6
Репутация
0
Garrett - я не ошибся темой, просто я думаю кто то с этим сталкивался и может подсказать в каком направлении рыть.

Dima1337 к сожалению это нормально не работает :(
Я думал подобный вариант, только сделать на HotKey UDF.


При WinSetOnTop($hForm, '', 1) GUI не сворачивается, я и думал, может есть вариант какой то, что бы было не поверх окон и не сворачивалось GUI.

Интересно.
Если из указного примера удалить SysListView321, то GUI не сворачивается, но другие окна, после повторного нажатия WIN + D, не разворачиваются. По ControlGetHandle посмотрел справку, там написано, что в этом месте должен находится controlID. Странно в общем :stars:

Код:
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>

Global $hDesktop = ControlGetHandle("[CLASS:Progman]", "", "") ; из ("[CLASS:Progman]", "", "SysListView321") удалить SysListView321
Global $hGui = GUICreate("Non Minimizable", 500, 500, -1, -1, $WS_MAXIMIZEBOX)
_WinAPI_SetWindowLong($hGui, $GWL_HWNDPARENT, $hDesktop)
GUISetState()

Do
Until GUIGetMsg() = -3



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

Придумал вот такой вариант, но он работает с задержкой. И он кривой, вообщем пока проблему не решил толком, вся надежда на вас форумчан :smile:


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

$hForm10 = GUICreate('', 200, 100, -1, -1)
GUISetBkColor(0x000000)

GUISetState(@SW_SHOW)

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

$iState = WinGetState($hForm10, "")

If BitAND($iState, 2) Then
WinSetState($hForm10, "", @SW_SHOW)
EndIf

If BitAND($iState, 16) Then
WinSetState($hForm10, "", @SW_RESTORE)
EndIf

WEnd
 

Dima1337

Осваивающий
Сообщения
186
Репутация
24
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 615, 437, 192, 124)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

Local $hDLL = DllOpen("user32.dll")

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

	EndSwitch
	if _IsPressed('5B',$hDLL) And _IsPressed('44',$hDLL) Then GUISetState(@SW_RESTORE, $Form1)
WEnd
 

Dima1337

Осваивающий
Сообщения
186
Репутация
24
Код:
If WinGetState($hForm10) <> 15 Then WinActivate($hForm10)

или
Код:
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $GUI_EVENT_MINIMIZE
			WinSetState($Form1,'',@SW_UNLOCK)
			WinActivate($Form1)
	EndSwitch
WEnd


OffTopic:
А что, тема все еще под предупреждением? Автор же исправил, нет?
 
Автор
neumexa

neumexa

Новичок
Сообщения
6
Репутация
0
Dima1337 это к сожалению все не то. Но спасибо за помощь :beer:
Пока остановился на таком варианте.
Код:
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
Global $hDesktop = ControlGetHandle("[CLASS:Progman]", "", "") ; из ("[CLASS:Progman]", "", "SysListView321") удалил SysListView321 и работает, непонятно, буду думать.
Global $hGui = GUICreate("Non Minimizable", 500, 500, -1, -1, $WS_MAXIMIZEBOX)
_WinAPI_SetWindowLong($hGui, $GWL_HWNDPARENT, $hDesktop)
GUISetState()
Do
Until GUIGetMsg() = -3

Плюс попутно буду использовать HotKey UDF и ей заменять WIN+D, все сворачивать, а GUI принудительно отображать через @SW_SHOW.
 

Dima1337

Осваивающий
Сообщения
186
Репутация
24
Я не понимаю, вам нужно что бы скрипт НЕ сворачивался, так? Если да, то в чем проблема?
Код:
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
Global $hDesktop = ControlGetHandle("[CLASS:Progman]", "", "") ; из ("[CLASS:Progman]", "", "SysListView321") удалил SysListView321 и работает, непонятно, буду думать.
Global $hGui = GUICreate("Non Minimizable", 500, 500, -1, -1, $WS_MAXIMIZEBOX)
_WinAPI_SetWindowLong($hGui, $GWL_HWNDPARENT, $hDesktop)
GUISetState()
Do
	If WinGetState($hGui) <> 15 Then WinSetState($hGui,'',@SW_RESTORE)
Until GUIGetMsg() = -3

Ах да! Запускайте скрипт от имени администратора...
 
Автор
neumexa

neumexa

Новичок
Сообщения
6
Репутация
0
Dima1337 я этот код нарыл в процессе решение проблемы и он не работал, пока не удалил SysListView321. Сейчас он работает и GUI не прячется, все как нужно. Но вот есть одна проблема с кодом, при повторном нажатии WIN+D, что бы обратно развернуть все свернутые окна, они не разворачиваются.
 

Dima1337

Осваивающий
Сообщения
186
Репутация
24
Теперь я понял, тогда нужно сделать свой аналог win+d
OffTopic:
с блекджеком и ...

Код:
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
Global $hGui = GUICreate("Non Minimizable", 500, 500, -1, -1, $WS_MAXIMIZEBOX)
GUISetState()
HotKeySet('!d','hide')

Global $hide = 0, $win[10000]

Do
	Sleep(100)
Until GUIGetMsg() = -3

Func hide()
	$nomore = 1
	If $nomore = 1 Then
	If $hide = 0 Then
		Global $active = WinGetTitle("[active]")
		$aList = WinList()
		For $i = 1 To $aList[0][0]
			If $aList[$i][0] <> "" And BitAND(WinGetState($aList[$i][1]), 8) Then
				$win[$i] = $aList[$i][1]
				WinSetState($aList[$i][1],'',@SW_MINIMIZE)
			EndIf
		Next
		WinSetState($hGui,'',@SW_RESTORE)
		$hide = 1
	Else
		For $i = 0 To 9999
			If $win[$i] <> '' Then
				WinSetState($win[$i],'',@SW_RESTORE)
			EndIf
		Next
		WinSetOnTop($active, '', 1)
		;WinSetState($active,'',@SW_SHOW)
		ConsoleWrite($active & @CRLF)
		WinSetOnTop($active, '', 0)
		$hide = 0
	EndIf
	$nomore = 0
	EndIf
EndFunc

alt+d
 
Автор
neumexa

neumexa

Новичок
Сообщения
6
Репутация
0
Это похоже на то что нужно, я вот Hotkey UDF хочу использовать для этого. Только вот не могу разобраться как сделать нажатия, что один раз свернуто, следующий развернуто, хотел последний твой код приспособить, но не получилось.

Код:
#Include <HotKey.au3>
Global Const $VK_D = 0x44
_HotKey_Assign(BitOR($CK_WIN, $VK_D), 'XXX_Launch')
$hForm1 = GUICreate('', 100, 100, -1, -1, $WS_POPUP)
GUISetState(@SW_SHOW)

Do
Until GUIGetMsg() = -3

Func XXX_Launch()

Local $oShell = ObjCreate("shell.application") ;  один раз нажато
$oShell.MinimizeAll

Local $oShell = ObjCreate("shell.application") ;  следующий раз нажато
$oShell.UndoMinimizeAll
;--------------
GUISetState(@SW_SHOW, $hForm1) ; всегда развернутое GUI

EndFunc
 

Dima1337

Осваивающий
Сообщения
186
Репутация
24
Код:
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $GUI_EVENT_MINIMIZE
            WinSetState($Form1,'',@SW_UNLOCK)
            WinActivate($Form1)
    EndSwitch
WEnd
Все же работает прекрасно :-X
Код:
#Include <HotKey.au3>
Global Const $VK_D = 0x44
_HotKey_Assign(BitOR($CK_WIN, $VK_D), 'XXX_Launch')
;HotKeySet('!d','XXX_Launch')
$hForm1 = GUICreate('', 100, 100, -1, -1);, $WS_POPUP)
GUISetState(@SW_SHOW)
$hWnd = WinGetHandle($hForm1)
Global $Push = 0

Do
Until GUIGetMsg() = -3

Func XXX_Launch()
	$Push = Not $Push
	If $Push Then
		Local $oShell = ObjCreate("shell.application") ;  один раз нажато
		$oShell.MinimizeAll
		WinSetState($hForm1,'',@SW_UNLOCK)
		WinActivate($hForm1)
	Else
		Local $oShell = ObjCreate("shell.application") ;  следующий раз нажато
		$oShell.UndoMinimizeAll
	EndIf
EndFunc



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

OffTopic:
ra4o сказал(а):
Вы считаете, чем в большем количестве тем задали один и тот-же вопрос тем ответ быстрее будет ?
Читайте правила:
В) При создании нового сообщения:
3. Сообщения следует оставлять в тему соответствующей тематики.
4. Не лепите несколько вопросов разной тематики в один пост. По типу "Ребят, а ещё такой вопрос...". Каждый вопрос в свою тему.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Dima1337
Вы не задумывались, почему я убирал ваши сообщения?!
В следующий раз будут более жёсткие меры. Вы не первый день на форуме.

neumexa
Вам объявлено предупреждение за игнорирование требований модератора.

ra4o
Нужно быть внимательнее!
 
Статус
Закрыто для дальнейших ответов.
Верх