Что нового

Изменение цвета шапки окна

CrazyDoc

Новичок
Сообщения
75
Репутация
2
Задача не касается напрямую к [abbr=AutoIt v3 is a freeware BASIC-like scripting language designed for automating the Windows GUI and general scripting][abbr=AutoIt v3 is a freeware BASIC-like scripting language designed for automating the Windows GUI and general scripting][abbr=AutoIt v3 is a freeware BASIC-like scripting language designed for automating the Windows GUI and general scripting][abbr=AutoIt v3 is a freeware BASIC-like scripting language designed for automating the Windows GUI and general scripting][abbr=AutoIt v3 is a freeware BASIC-like scripting language designed for automating the Windows GUI and general scripting][abbr=AutoIt v3 is a freeware BASIC-like scripting language designed for automating the Windows GUI and general scripting][abbr=AutoIt v3 is a freeware BASIC-like scripting language designed for automating the Windows GUI and general scripting]AIt[/abbr][/abbr][/abbr][/abbr][/abbr][/abbr][/abbr], вопрос задан с той надеждой что присутствующие на форуме опытные люди когда-либо сталкивались с подобной проблемой.
Задача в следующем - запуск программы с определенным цветом шапки окна.
Т.к. по работе приходится запускать несколько однообразных окон - для лучшего различия(вроде - зеленый, действую смело - тестовый полигон. красны - не лезь, убьет). Возможно кто-либо встречался с параметрами запуска окна, приложениями позволяющими это провернуть.
Для WinXP и Win7

UP. Наткнувшись на это:
http://www.vsokovikov.narod.ru/New_MSDN_API/Sys_info/fn_getsyscolor.htm
, предполагаю что можно использовать COLOR_WINDOWFRAME если присоединить user32.lib. Но как это все провернуть - все так же остается загадкой для меня. Буду рад советам.

COLOR_WINDOWFRAME - ересь. Позволит поменять цвет заголовка, но для всех окон. В MSDN откопал вот это WM_NCPAINT:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd145212(v=vs.85).aspx
и даже вроде нашел пример его использования в AutoIT:
http://www.autoitscript.ro/tutorial-autoit/2d-game-demo/
Код:
#include <GDIPlus.au3>
#include <Sound.au3>

Global $hMain, $hWall, $hPlayer, $hMob, $hGate, $hGraphics, $hClone, $hBackBuffer
Global $GameOver = False, $GameFinish = False, $Pause = False, $Sound

Global $ObjPlayer = CreateObject(30,30,30,30,30,390,30,420)
Global $ObjMob = CreateObject(210,210,30,30,30,390,30,420)
Global $ObjGate = CreateObject(390,420,30,30,30,390,30,420)

_GDIPlus_Startup()
$hWall = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Gfx\Wall.bmp")
$hPlayer = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Gfx\Player.bmp")
$hMob = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Gfx\Mob.bmp")
$hGate = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Gfx\Gate.bmp")

$hMain = GUICreate("GDI+ 2D Game Demo",458,505,-1,-1,0x80000000,0x00000008)
$hBackground = GUICtrlCreatePic(@ScriptDir & "\Gfx\Background.bmp",0,0,458,505)
$hLabel = GUICtrlCreateLabel("GDI+ 2D Game Demo",5,2,150,18)
$hMinimize = GUICtrlCreatePic(@ScriptDir & "\Gfx\Minimize.bmp",415,0,20,20)
$hClose = GUICtrlCreatePic(@ScriptDir & "\Gfx\Close.bmp",435,0,20,20)
GUICtrlSetColor($hLabel,0xFFFFFF)
GUICtrlSetBkColor($hLabel,0x000000)
GUICtrlSetFont($hLabel,10,600,0,"Garamond")
GUICtrlSetState($hBackground,128)
GUISetState(@SW_SHOW,$hMain)

SoundSetWaveVolume(50)
$Sound = _SoundOpen(@ScriptDir & "\Snd\Medley.wav")
_SoundPlay($Sound)

$hGraphics = _GDIPlus_GraphicsCreateFromHWND($hMain)
$hBitmap = _GDIPlus_BitmapCreateFromGraphics(458,505,$hGraphics)
$hClone = _GDIPlus_BitmapCloneArea($hBitmap,4,21,450,480,$GDIP_PXF24RGB)
$hBackBuffer = _GDIPlus_ImageGetGraphicsContext($hClone)

GUIRegisterMsg(0x85,"REPAINT")
GUIRegisterMsg(0x0F,"REPAINT")

HotKeySet("{UP}","MoveUp")
HotKeySet("{DOWN}","MoveDown")
HotKeySet("{LEFT}","MoveLeft")
HotKeySet("{RIGHT}","MoveRight")
HotKeySet("{PAUSE}","Pause")
AdlibRegister("MoveMobRandom",1000)

Do
	Switch GUIGetMsg()
		Case -7
			_SendMessage($hMain,0x0112,0xF012,0)
		Case $hMinimize
			GUISetState(@SW_MINIMIZE,$hMain)
		Case $hClose
			ExitLoop
	EndSwitch
	If (_SoundStatus($Sound) <> "playing") And (Not $Pause) Then _SoundPlay($Sound)
	_GDIPlus_GraphicsClear($hBackBuffer,0xFF000000)
	For $X = 0 To 450 Step 30
		_GDIPlus_GraphicsDrawImage($hBackBuffer,$hWall,$X,0)
		_GDIPlus_GraphicsDrawImage($hBackBuffer,$hWall,$X,450)
	Next
	For $Y = 0 To 480 Step 30
		_GDIPlus_GraphicsDrawImage($hBackBuffer,$hWall,0,$Y)
		_GDIPlus_GraphicsDrawImage($hBackBuffer,$hWall,420,$Y)
	Next
	If ObjectsOverlap($ObjPlayer,$ObjMob) Then
		AdlibUnRegister("MoveMobRandom")
		$GameOver = True
	EndIf
	If ObjectsOverlap($ObjPlayer,$ObjGate) Then
		AdlibUnRegister("MoveMobRandom")
		$GameFinish = True
	EndIf
	If ObjectsOverlap($ObjMob,$ObjGate) Then
		UpdateObject($ObjMob,$ObjMob[0]-30,$ObjMob[1])
	EndIf
	_GDIPlus_GraphicsDrawImage($hBackBuffer,$hPlayer,$ObjPlayer[0],$ObjPlayer[1])
	_GDIPlus_GraphicsDrawImage($hBackBuffer,$hMob,$ObjMob[0],$ObjMob[1])
	_GDIPlus_GraphicsDrawImage($hBackBuffer,$hGate,$ObjGate[0],$ObjGate[1])
	_GDIPlus_GraphicsDrawImage($hGraphics,$hClone,4,21)
	Sleep(10)
Until $GameOver Or $GameFinish

_SoundStop($Sound)
_SoundClose($Sound)

If $GameOver Then
	$Sound = _SoundOpen(@ScriptDir & "\Snd\Over.wav")
	TrayTip("Game Over","Mancat de mob",1)
ElseIf $GameFinish Then
	TrayTip("Game Finish","Ajuns la poarta",1)
	$Sound = _SoundOpen(@ScriptDir & "\Snd\Finish.wav")
Else
	$Sound = _SoundOpen(@ScriptDir & "\Snd\Exit.wav")
	TrayTip("Exit","Userul a inchis jocul",1)
EndIf
_SoundPlay($Sound)
Sleep(5000)

_SoundStop($Sound)
_SoundClose($Sound)

_GDIPlus_ImageDispose($hGate)
_GDIPlus_ImageDispose($hMob)
_GDIPlus_ImageDispose($hPlayer)
_GDIPlus_ImageDispose($hWall)
_GDIPlus_BitmapDispose($hClone)
_GDIPlus_GraphicsDispose($hBackBuffer)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()

Func MoveUp()
	UpdateObject($ObjPlayer,$ObjPlayer[0],$ObjPlayer[1]-30)
EndFunc

Func MoveDown()
	UpdateObject($ObjPlayer,$ObjPlayer[0],$ObjPlayer[1]+30)
EndFunc

Func MoveLeft()
	UpdateObject($ObjPlayer,$ObjPlayer[0]-30,$ObjPlayer[1])
EndFunc

Func MoveRight()
	UpdateObject($ObjPlayer,$ObjPlayer[0]+30,$ObjPlayer[1])
EndFunc

Func MoveMobRandom()
	Switch Random(1,4,1)
		Case 1
			UpdateObject($ObjMob,$ObjMob[0],$ObjMob[1]-30)
		Case 2
			UpdateObject($ObjMob,$ObjMob[0],$ObjMob[1]+30)
		Case 3
			UpdateObject($ObjMob,$ObjMob[0]-30,$ObjMob[1])
		Case 4
			UpdateObject($ObjMob,$ObjMob[0]+30,$ObjMob[1])
	EndSwitch
EndFunc

Func Pause()
	$Pause = Not $Pause
	If $Pause Then
		AdlibUnRegister("MoveMobRandom")
		HotKeySet("{UP}")
		HotKeySet("{DOWN}")
		HotKeySet("{LEFT}")
		HotKeySet("{RIGHT}")
		_SoundPause($Sound)
	Else
		AdlibRegister("MoveMobRandom",1000)
		HotKeySet("{UP}","MoveUp")
		HotKeySet("{DOWN}","MoveDown")
		HotKeySet("{LEFT}","MoveLeft")
		HotKeySet("{RIGHT}","MoveRight")
		_SoundResume($Sound)
	EndIf
EndFunc

Func REPAINT($hWnd,$msg,$wParam,$lParam)
    _GDIPlus_GraphicsDrawImage($hGraphics,$hClone,4,21)
    Return _WinAPI_DefWindowProc($hWnd,$msg,$wParam,$lParam)
EndFunc

Func CreateObject($X,$Y,$W,$H,$MinX,$MaxX,$MinY,$MaxY)
	Local $Object[8] = [$X,$Y,$W,$H,$MinX,$MaxX,$MinY,$MaxY]
	Return $Object
EndFunc

Func UpdateObject(ByRef $Obj,$X,$Y)
	If $X < $Obj[4] Then $X = $Obj[4]
   	If $X > $Obj[5] Then $X = $Obj[5]
	If $Y < $Obj[6] Then $Y = $Obj[6]
   	If $Y > $Obj[7] Then $Y = $Obj[7]
	$Obj[0] = $X
	$Obj[1] = $Y
EndFunc

Func ObjectsOverlap($Obj1,$Obj2)
    Local $SX = Abs($Obj2[0] - $Obj1[0]) + $Obj2[2]
    Local $SY = Abs($Obj2[1] - $Obj1[1]) + $Obj2[3]
    Return ($SX < $Obj1[2] + $Obj2[2] And $SY < $Obj1[3] + $Obj2[3])
EndFunc
Но разобраться пока силенок не хватает. По прежнему буду рад советам.

UP. Я идиот - последняя функция позволяет не изменить цвет, а обновить область окна.
Методы решения задачи все так же неизвестны.

Было решено использовать костыль в виде:
Код:
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

_Main()


Func _Main()
    Local $aElements[2] = [$COLOR_ACTIVECAPTION, $COLOR_GRADIENTACTIVECAPTION]
    ; Красный и жёлтый
    Local $aColors[2] = [255, 65535], $aSaveColors[2]

    DllCall("uxtheme.dll", "none", "SetThemeAppProperties", "int", 0) ; отключение темы для окна

    GUICreate("Мой GUI", 300, 200)

    ; Сохранение текущего цвета
    $aSaveColors[0] = _WinAPI_GetSysColor($COLOR_ACTIVECAPTION)
    $aSaveColors[1] = _WinAPI_GetSysColor($COLOR_GRADIENTACTIVECAPTION)

    ; Устанавливает новый цвет
	While 1
	if WinActive("Сеанс","") Then
    _WinAPI_SetSysColors($aElements, $aColors)
   Else
    ; Восстановление предыдущих установок
    _WinAPI_SetSysColors($aElements, $aSaveColors)
 EndIf
 WEnd
EndFunc
Т.к. возможности изменить цвет шапки отдельного окна, созданного по формам - НЕТ. Есть только возможность ковырять скины окон, но, это если окна были созданы руками.

На данный момент актуальна следующая задача - постоянно мерцает экран, при работе приведенного скрипта. Может кто-нибудь подсказать в чем загвоздка? (Up. Загвоздка была в том что смена цвета повторялась в цикле без проверки уже установленного, т.е. постоянно)
 
Автор
C

CrazyDoc

Новичок
Сообщения
75
Репутация
2
Up. Эпопея продолжается((( COLOR_WINDOWFRAME(используемый в последнем варианте костыля) - уверенно меняет цвет только в упрощенной схеме отображения. В стандартной шапка остается такой же как и была(при этом в моменты сворачивания окон видно что цвет все таки-сменился). Буду рад подсказкам.
 
Верх