Что нового

Проблема со стилем повер всех окон.

ynbIpb

Скриптер
Сообщения
398
Репутация
109
Вобщем нужно мне создать маленькое окошко, но чтобы оно было всегда поверх всех окон. Поставил ему соответствующий стиль $WS_EX_TOPMOST, Но! если его перекрывает другое окно с свойствами поверх всех, то моё окно остаётся под ним. Как сделать чтоб моё имело больший приоритет?
Код:
#NoTrayIcon
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Form1", 100, 200, 0, 0, $WS_VISIBLE, BitOR ($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW))
$Button1 = GUICtrlCreateButton("Выход", 10, 10, 75, 25, 0)
GUISetState(@SW_SHOW)

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

з.ы.
И ещё: как запретить таскать окно за верхнюю рамку?
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
ynbIpb
Попробуй так...

Код:
WinSetOnTop($Form1,"",1)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 156
Репутация
2 329
ynbIpb [?]
Как сделать чтоб моё имело больший приоритет?
Приоритет вроде поставить нельзя, но можно постоянно (точнее только тогда когда окно не активно) активировать окно.
Вот так примерно:

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

Global $iActivate = 0

Opt('GUIOnEventMode', 1)

$hMainGUI = GUICreate('WM_ACTIVATE Demo', 330, 185, -1, -1, -1, $WS_EX_TOPMOST)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Main_Events')

$nExit_Button = GUICtrlCreateButton('Exit', 330 - 100 - 10, 130 + 10 + 10, 100, 23)
GUICtrlSetOnEvent(-1, '_Main_Events')

GUISetState(@SW_SHOW, $hMainGUI)
GUIRegisterMsg($WM_ACTIVATE, 'WM_ACTIVATE')

While 1
	Sleep(10)
	
	If $iActivate Then
		$iActivate = 0
		WinActivate($hMainGUI)
	EndIf
WEnd

Func _Main_Events()
	Switch @GUI_CtrlId
		Case $GUI_EVENT_CLOSE, $nExit_Button
			Exit
	EndSwitch
EndFunc

Func WM_ACTIVATE($hWnd, $Msg, $wParam, $lParam)
	Local $iMainWinWinActive = Int(Hex($wParam))
	
	If $iMainWinWinActive == 2 Then $iMainWinWinActive = 1
	If $iMainWinWinActive > 2 Then $iMainWinWinActive = 0
	
	$iActivate = ($iMainWinWinActive = 0)
EndFunc



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

snoitaleR [?]
Это тоже самое что и со стилем ;)


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

ynbIpb [?]
как запретить таскать окно за верхнюю рамку?
Код:
#include <GUIConstantsEx.au3>

Const $WM_SYSCOMMAND = 0x0112
Const $SC_MOVE = 0xF010

$gui = GUICreate("", 300, 200)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")

While GUIGetMsg() <> $GUI_EVENT_CLOSE
WEnd

Func WM_SYSCOMMAND($hWnd, $Msg, $wParam, $lParam)
	If BitAND($wParam, 0xFFF0) = $SC_MOVE Then Return 0
EndFunc
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
CreatoR
Согласен...
QIP Infium перекрывает окно с командой WinSetOnTop($Form1,"",1)...

Классно сделано окно SplashTextOn()...
Идеально... :smile:

Кстати, пример из ответа №2 не поверх QIP Infium тоже...
И еще ведет себя немного неестественно...
 
Автор
Y

ynbIpb

Скриптер
Сообщения
398
Репутация
109
Спасибо за примеры, но не помогает. другое окно всёравно его перекрывает (например диспетчер задач виндовый). И этот метод мешает нормальной работе с другими окнам, сбивая фокус.
 

Guezt

Продвинутый
Сообщения
335
Репутация
81
Напишите в цикле ожидание окна, потом создавайте это окно по верх остальных как дочернее MODAL вроде, от любого появившегося... сейчас некогда самому, но в примере с подстановкой кнопки на чужое окно примерно тот же смысл, что вам, профи, стоит сделать вместо кнопки модальное окно к любому из появившихся :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 156
Репутация
2 329
ynbIpb [?]
другое окно всёравно его перекрывает (например диспетчер задач виндовый)
А если так:

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

Opt("WinWaitDelay", 0)
Opt("GUIOnEventMode", 1)

;ShellHook notification codes:
Global Const $HSHELL_WINDOWCREATED = 1
Global Const $HSHELL_WINDOWACTIVATED = 4

Global $bHook = 1

$hMainGUI = GUICreate('WM_ACTIVATE Demo', 330, 185, -1, -1, BitOR($WS_CAPTION, $WS_POPUP, $DS_SETFOREGROUND), $WS_EX_TOPMOST)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Main_Events')

$nExit_Button = GUICtrlCreateButton('Exit', 330 - 100 - 10, 130 + 10 + 10, 100, 23)
GUICtrlSetOnEvent(-1, '_Main_Events')

GUISetState(@SW_SHOW, $hMainGUI)
GUIRegisterMsg(RegisterWindowMessage("SHELLHOOK"), "HShellWndProc")
ShellHookWindow($hMainGUI, $bHook)

While 1
    Sleep(10)
WEnd

Func _Main_Events()
	Switch @GUI_CtrlId
		Case $GUI_EVENT_CLOSE, $nExit_Button
			ShellHookWindow($hMainGUI, 0)
			Exit
	EndSwitch
EndFunc

Func HShellWndProc($hWnd, $Msg, $wParam, $lParam)
	Switch $wParam
		Case $HSHELL_WINDOWCREATED, $HSHELL_WINDOWACTIVATED
			While Not WinActive($hMainGUI)
				WinActivate($hMainGUI)
			WEnd
	EndSwitch
EndFunc

;register/unregister ShellHook
Func ShellHookWindow($hWnd, $bFlag)
	Local $sFunc = 'DeregisterShellHookWindow'
	If $bFlag Then $sFunc = 'RegisterShellHookWindow'
	Local $aRet = DllCall('user32.dll', 'int', $sFunc, 'hwnd', $hWnd)
	Return $aRet[0]
EndFunc

;register window message
Func RegisterWindowMessage($sText)
	Local $aRet = DllCall('user32.dll', 'int', 'RegisterWindowMessage', 'str', $sText)
	Return $aRet[0]
EndFunc


?


этот метод мешает нормальной работе с другими окнам, сбивая фокус
Ну а как ты себе представляешь это иначе, два окна не могуть быть активны одновременно.
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
CreatoR
Тут, наверное, дело в том, что нужно, чтобы окно было поверх других, но не обязательно было активно...

Поэкспериментируйте с окном SplashOnText()...
Я думаю, это то, что хотелось, чтобы было...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 156
Репутация
2 329
snoitaleR [?]
жно, чтобы окно было поверх других, но не обязательно было активно
Это то что и делает WinSetOnTop или стиль $WS_EX_TOPMOST.

Поэкспериментируйте с окном SplashOnText()...
Я думаю, это то, что хотелось, чтобы было...
Не то, тот же Диспетчер задач спокойно становится поверх него.
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
CreatoR
У меня SplashTextOn() поверх даже активного Диспетчера задач...
Но я заметил такую особенность: такое ощущение, что функция WinSetOnTop() вызывается просто по времени через, например, 100 миллисекунд, и поэтому SplashTextOn() перекрывает снова и снова окно Диспетчера задач...

SplashTextOn() и Диспетчер задач на полном серьезе борятся за то, кто будет "ближе" к пользователю... :smile:

И еще интересный факт: SplashTextOn() борется даже с ALTDESK, оставаясь на любом виртуальном рабочем столе поверх всех окон...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 156
Репутация
2 329
snoitaleR [?]
У меня SplashTextOn() поверх даже активного Диспетчера задач...
Он то поверх, но если при этом активировать окно диспетчера, то этот Splash "уходит" за него.
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
CreatoR
Я, кажется, нашел нужное событие WM_ACTIVATETOPLEVEL (0x036E), но не знаю, как его обработать...
Пробовал, не получается... :smile:

Вот, как мне кажется, имитация SplashTextOn()
Код:
; НАЧАЛО

 $GUI=GUICreate("",300,200)
 GUISetState()

 While true
  if GUIGetMsg()=-3 then Exit
  WinSetState($GUI,"",@SW_SHOW)
  WinSetOnTop($GUI,"",1)
  Sleep(10)
 WEnd

; КОНЕЦ


:smile:
 
Автор
Y

ynbIpb

Скриптер
Сообщения
398
Репутация
109
snoitaleR, оно! то что надо.
Окно всегда поверх, но не мешает работать с активными окнами.
Спасибо.
 
Верх