Jump to content
Sign in to follow this  
CodeMaster Rapture

[Possible?] Change style of non-Au3 GUI.

Recommended Posts

CodeMaster Rapture

Hey there,

I'm working on a simple script to resize and move some windows (tile them). I've got the foundation working. I was curious if it is possible to change the styles/ex-styles of windows not created through Au3. I want to strip the titlebars and borders from 3 windows so all I get is the client area. Any suggestions (Au3, C++, or even C#)? Obviously GUISetStyle() doesn't work because I didn't create the window in Au3 (even if I do pass the handle).

Here's my code so far:

HotKeySet("{F9}","_LayoutOne")
HotKeySet("{F10}","_LayoutTwo")
HotKeySet("{F11}","_LayoutThree")
Opt("MouseCoordMode",1)

Global $a_WindowInfo[3][5]
;[X][0] = Window Title
;[X][1] = Current X Position
;[X][2] = Current Y Position
;[X][3] = Current Width
;[X][4] = Current Height

$a_WindowInfo[0][0] = "myNotepad One"
$a_WindowInfo[1][0] = "myNotepad Two"
$a_WindowInfo[2][0] = "myNotepad Three"

Global $a_WindowPreset[3][4]
;Preset for window 1
$a_WindowPreset[0][0] = -4 ;Xpos
$a_WindowPreset[0][1] = -30 ;Ypos
$a_WindowPreset[0][2] = 1288 ;Width
$a_WindowPreset[0][3] = 824 ;Height
;Preset for window 2
$a_WindowPreset[1][0] = -4
$a_WindowPreset[1][1] = 764
$a_WindowPreset[1][2] = 645
$a_WindowPreset[1][3] = 265
;Preset for window 3
$a_WindowPreset[2][0] = 640
$a_WindowPreset[2][1] = 764
$a_WindowPreset[2][2] = 645
$a_WindowPreset[2][3] = 265

While 1
    If (WinActive("Notepad")) Then
        $sz_Rename = InputBox("Setup","Rename it to what?")
        WinSetTitle("Notepad","",$sz_Rename)
    EndIf
    
    Sleep(100)
WEnd

Func _SetWindowToPreset($Char,$Preset)
    If (Not WinExists($a_WindowInfo[0][0]) Or Not WinExists($a_WindowInfo[1][0]) Or Not WinExists($a_WindowInfo[2][0])) Then
        Return
    EndIf
    $a_WindowInfo[$Char][1] = $a_WindowPreset[$Preset][0]
    $a_WindowInfo[$Char][2] = $a_WindowPreset[$Preset][1]
    $a_WindowInfo[$Char][3] = $a_WindowPreset[$Preset][2]
    $a_WindowInfo[$Char][4] = $a_WindowPreset[$Preset][3]
EndFunc

Func _LayoutOne()
    _SetWindowToPreset(0,0)
    _SetWindowToPreset(1,1)
    _SetWindowToPreset(2,2) 
    _MoveEm()
EndFunc

Func _LayoutTwo()
    _SetWindowToPreset(1,0)
    _SetWindowToPreset(0,1)
    _SetWindowToPreset(2,2) 
    _MoveEm()
EndFunc

Func _LayoutThree()
    _SetWindowToPreset(2,0)
    _SetWindowToPreset(1,1)
    _SetWindowToPreset(0,2)
    _MoveEm()
EndFunc

Func _MoveEm()
    If (Not WinExists($a_WindowInfo[0][0]) Or Not WinExists($a_WindowInfo[1][0]) Or Not WinExists($a_WindowInfo[2][0])) Then
        Return
    EndIf
    WinMove($a_WindowInfo[0][0],"",$a_WindowInfo[0][1],$a_WindowInfo[0][2],$a_WindowInfo[0][3],$a_WindowInfo[0][4])
    WinMove($a_WindowInfo[1][0],"",$a_WindowInfo[1][1],$a_WindowInfo[1][2],$a_WindowInfo[1][3],$a_WindowInfo[1][4])
    WinMove($a_WindowInfo[2][0],"",$a_WindowInfo[2][1],$a_WindowInfo[2][2],$a_WindowInfo[2][3],$a_WindowInfo[2][4])
EndFunc

Thanx in advance,

CMR

Share this post


Link to post
Share on other sites
BrettF

To set the extended style:

$hwnd = window
$nExStyle = DllCall("user32.dll", "int", "GetWindowLong", "hwnd", $hWnd, "int", -20)
$nExStyle = $nExStyle[0]
DllCall("user32.dll", "int", "SetWindowLong", "hwnd", $hWnd, "int", -20, "int", BitOR($nExStyle, $all_other_ex_styles))

I'm sure you can work out the rest now you know where to look :D

Edited by Bert

Share this post


Link to post
Share on other sites
therks

Funny, I was just playing with this recently. I wrote up this function:

Func _ChangeWinStyle($hWnd, $aSetStyles = false)
    Local Const $GWL_EXSTYLE = -20
    Local Const $GWL_STYLE = -16
    Local $aSize = WinGetPos($hWnd)
    Local $aStyle = DllCall('user32.dll', 'int', 'GetWindowLong', 'hwnd', $hWnd, 'int', $GWL_STYLE)
    If @error Then Return SetError(1, 0, 0)
    Local $aExStyle = DllCall('user32.dll', 'int', 'GetWindowLong', 'hwnd', $hWnd, 'int', $GWL_EXSTYLE)
    If @error Then Return SetError(2, 0, 0)
    Local $aReturn[2] = [ $aStyle[0], $aExStyle[0] ]
    If UBound($aSetStyles) < 2 Then
        Local $t[2] = [ BitOr($WS_OVERLAPPED, $WS_CAPTION, $WS_SYSMENU, $WS_THICKFRAME), $WS_EX_TOOLWINDOW ]
        $aSetStyles = $t
    EndIf
    
    WinSetState($hWnd, '', @SW_HIDE)
    DllCall('user32.dll', 'int', 'SetWindowLong', _
        'hwnd', $hWnd, _
        'int', $GWL_STYLE, _
        'int', $aSetStyles[0])
    DllCall('user32.dll', 'int', 'SetWindowLong', _
        'hwnd', $hWnd, _
        'int', $GWL_EXSTYLE, _
        'int', $aSetStyles[1])
    WinMove($hWnd, '', $aSize[0], $aSize[1], $aSize[2]+1, $aSize[3]+1)
    WinMove($hWnd, '', $aSize[0], $aSize[1], $aSize[2], $aSize[3])
    WinSetState($hWnd, '', @SW_SHOW)
    
    Return $aReturn
EndFuncoÝ÷ زë"­²¶§X¤zØb±«­¢+ØÀÌØí¡]¹ô]¥¹Ñ!¹± Ìäím
1MLé9½ÑÁtÌäì¤(ÀÌØí=±MÑå±Ìô}
¡¹]¥¹MÑå± ÀÌØí¡]¹¤)M±À ÔÀÀÀ¤)}
¡¹]¥¹MÑå± ÀÌØí¡]¹°ÀÌØí=±MÑå±Ì¤

I've had some weird graphical glitches with some windows which seemed to be fixed by resizing the window just a bit, hence the WinMove statements at the end of the function.

I'm sure it's not exactly what you're looking for, but something to work from.

Share this post


Link to post
Share on other sites
CodeMaster Rapture

Perfect!

Thanx so much!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×