Задача не касается напрямую к [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. Наткнувшись на это:
, предполагаю что можно использовать COLOR_WINDOWFRAME если присоединить user32.lib. Но как это все провернуть - все так же остается загадкой для меня. Буду рад советам.
COLOR_WINDOWFRAME - ересь. Позволит поменять цвет заголовка, но для всех окон. В MSDN откопал вот это WM_NCPAINT:
и даже вроде нашел пример его использования в AutoIT:
Но разобраться пока силенок не хватает. По прежнему буду рад советам.
UP. Я идиот - последняя функция позволяет не изменить цвет, а обновить область окна.
Методы решения задачи все так же неизвестны.
Было решено использовать костыль в виде:
Т.к. возможности изменить цвет шапки отдельного окна, созданного по формам - НЕТ. Есть только возможность ковырять скины окон, но, это если окна были созданы руками.
На данный момент актуальна следующая задача - постоянно мерцает экран, при работе приведенного скрипта. Может кто-нибудь подсказать в чем загвоздка? (Up. Загвоздка была в том что смена цвета повторялась в цикле без проверки уже установленного, т.е. постоянно)
Задача в следующем - запуск программы с определенным цветом шапки окна.
Т.к. по работе приходится запускать несколько однообразных окон - для лучшего различия(вроде - зеленый, действую смело - тестовый полигон. красны - не лезь, убьет). Возможно кто-либо встречался с параметрами запуска окна, приложениями позволяющими это провернуть.
Для WinXP и Win7
UP. Наткнувшись на это:
http://www.vsokovikov.narod.ru/New_MSDN_API/Sys_info/fn_getsyscolor.htm
COLOR_WINDOWFRAME - ересь. Позволит поменять цвет заголовка, но для всех окон. В MSDN откопал вот это WM_NCPAINT:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd145212(v=vs.85).aspx
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. Загвоздка была в том что смена цвета повторялась в цикле без проверки уже установленного, т.е. постоянно)