Что нового

Скрыть рамку запущенного окна

Grx-Lin

Новичок
Сообщения
27
Репутация
0
Нужна помощь,не могу сам разобраться. Как убрать полностью рамку,оставить только черный фон и при этом что бы фокус работал стабильно. И желательно что бы окно было неподвижным. Но как я понимаю,если рамку убрать. Двигать его не получится.
Код:
#include <WindowsConstants.au3>
#Include <WinAPI.au3>
$GUI = GUICreate("Switch Configurator", 700, 600, 550, 300, BitOR($WS_MINIMIZEBOX,$WS_SYSMENU,$WS_CAPTION,$WS_CLIPCHILDREN,$WS_POPUP,$WS_POPUPWINDOW,$WS_GROUP,$WS_BORDER,$WS_CLIPSIBLINGS))
GUISetState(@SW_SHOW)

$handle = ShellExecute ("cmd.exe","","C:\Users\Grx-lin\Downloads\")
Sleep(100)

$handle2 = _GetHwndFromPID($handle)

_WinAPI_SetWindowLong($handle, $GWL_EXSTYLE , $WS_EX_MDICHILD)
_WinAPI_SetParent($handle2,$GUI)

;~ WinSetState($AR1,"",@SW_MINIMIZE)

WinMove($handle2,"",0,250,700,310)
WinSetState($handle2,"",@SW_LOCK)

Func _GetHwndFromPID($PID)
    $hWnd = 0
    $stPID = DllStructCreate("int")
    Do
        $winlist2 = WinList()
        For $i = 1 To $winlist2[0][0]
            If $winlist2[$i][0] <> "" Then
                DllCall("user32.dll", "int", "GetWindowThreadProcessId", "hwnd", $winlist2[$i][1], "ptr", DllStructGetPtr($stPID))
                If DllStructGetData($stPID, 1) = $PID Then
                    $hWnd = $winlist2[$i][1]
                    ExitLoop
                EndIf
            EndIf
        Next
        Sleep(100)
    Until $hWnd <> 0
    Return $hWnd
EndFunc ;==>_GetHwndFromPID
Sleep(10000)
 
Автор
G

Grx-Lin

Новичок
Сообщения
27
Репутация
0
Не нашел там нужного мне. А может как нибудь вокруг cmd.exe. Сделать рамку? Такого же белого цвета как и фон. Только не знаю как.
 

Sαuron

Новичок
Сообщения
45
Репутация
1
Grx-Lin сказал(а):
Не нашел там нужного мне. А может как нибудь вокруг cmd.exe. Сделать рамку? Такого же белого цвета как и фон. Только не знаю как.

Код:
#include <WindowsConstants.au3>
#Include <WinAPI.au3>
$GUI = GUICreate("Switch Configurator", 700, 600, 550, 300, $WS_POPUP)
GUISetState(@SW_SHOW)
Run(@ComSpec & " /c " & 'taskkill -f -im cmd.exe', "", @SW_HIDE)
sleep(2000)
$handle = ShellExecute ("cmd.exe","","C:\Users\Grx-lin\Downloads\")
Sleep(100)

$handle2 = _GetHwndFromPID($handle)
;================================================
$size = wingetclientsize($handle2)
_winapi_setwindowlong($handle2, $GWL_STYLE, $ws_popup)
_winapi_setwindowlong($handle2, $GWL_EXSTYLE, 0)
_winapi_setwindowpos($handle2, 0, 0, 0, 0, 0, BitOR($SWP_SHOWWINDOW, $SWP_NOSIZE, $SWP_NOMOVE, $SWP_NOZORDER))
winmove($GUI, '', 400, 400, $size[0], $size[1])
_WinAPI_SetParent($handle2, $GUI)
winmove($handle2, '', 0, 0)
;~ winmove($handle2, '', 0, 0, $size[2], $size[3])

;~ WinSetState($AR1,"",@SW_MINIMIZE)

;~ WinMove($handle2,"",0,250,700,310)
;~ WinSetState($handle2,"",@SW_LOCK)

Func _GetHwndFromPID($PID)
    $hWnd = 0
    $stPID = DllStructCreate("int")
    Do
        $winlist2 = WinList()
        For $i = 1 To $winlist2[0][0]
            If $winlist2[$i][0] <> "" Then
                DllCall("user32.dll", "int", "GetWindowThreadProcessId", "hwnd", $winlist2[$i][1], "ptr", DllStructGetPtr($stPID))
                If DllStructGetData($stPID, 1) = $PID Then
                    $hWnd = $winlist2[$i][1]
                    ExitLoop
                EndIf
            EndIf
        Next
        Sleep(100)
    Until $hWnd <> 0
    Return $hWnd
EndFunc ;==>_GetHwndFromPID
while 1
   sleep(1000)
wend


А если рамка, то замени это winmove($GUI, '', 400, 400, $size[0], $size[1]) на это:
winmove($GUI, '', 400, 400, $size[0]+20, $size[1]+20)
и это:
winmove($handle2, '', 0, 0) на это winmove($handle2, '', 10, 10)
 
Автор
G

Grx-Lin

Новичок
Сообщения
27
Репутация
0
Это немного не то,или я не понимаю. Выглядит сейчас так,нужно оставить такой размер cmd. Но убрать рамку.
12966290.png
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Sαuron
Только GUI не сворачивайте ;)
Код:
#include <WindowsConstants.au3>
#Include <WinAPI.au3>

$GUI = GUICreate("Switch Configurator", 700, 600)
GUISetState(@SW_SHOW)

$PID = Run(@ComSpec)
$hWnd = WinWaitActive("[class:ConsoleWindowClass]")
_WinAPI_SetWindowLong($hWnd, $GWL_STYLE, $WS_POPUP)
WinSetState($hWnd, "", @SW_SHOW)
_WinAPI_SetParent($hWnd, $GUI)
WinMove($hWnd, "", 40, 40)

Do
Until GUIGetMsg() = -3

ProcessClose($PID)
 
Автор
G

Grx-Lin

Новичок
Сообщения
27
Репутация
0
InnI сказал(а):
Sαuron
Только GUI не сворачивайте ;)
Код:
#include <WindowsConstants.au3>
#Include <WinAPI.au3>

$GUI = GUICreate("Switch Configurator", 700, 600)
GUISetState(@SW_SHOW)

$PID = Run(@ComSpec)
$hWnd = WinWaitActive("[class:ConsoleWindowClass]")
_WinAPI_SetWindowLong($hWnd, $GWL_STYLE, $WS_POPUP)
WinSetState($hWnd, "", @SW_SHOW)
_WinAPI_SetParent($hWnd, $GUI)
WinMove($hWnd, "", 40, 40)

Do
Until GUIGetMsg() = -3

ProcessClose($PID)
Да,это то что нужно. Я вот победил,глюки с обычным окном(Когда была рамка). С помощью этого
Код:
$GUI = GUICreate("Switch Configurator", 700, 600, 550, 300, BitOR($WS_MINIMIZEBOX,$WS_SYSMENU,$WS_CAPTION,$WS_POPUP,$WS_POPUPWINDOW,$WS_GROUP,$WS_BORDER,$WS_CLIPSIBLINGS,$WS_CLIPCHILDREN))
$WS_CLIPCHILDREN

А теперь это не действует,исправить то как то возможно? Посворачивать хочется.
UPD: Глюки исчезли,сворачивать можно. Ошибся я немного. Правда когда я использую все эти,$WS_CLIPCHILDREN и т.д. У меня ломается
Код:
GUICtrlCreateTabItem("Настройка коммутатора")
;Переменные
;Введите пароль
$Label1 = GUICtrlCreateLabel("Введите пароль", 10, 37, 100, 20)
$InputPass = GUICtrlCreateInput('', 141, 35, 200, 18, -1, $WS_EX_STATICEDGE)
$sText = GUICtrlRead($InputPass)

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

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Grx-Lin
Может, вам проще будет общаться с консолью, а не встраивать её?
Код:
$GUI = GUICreate("Console")
$Inp = GUICtrlCreateInput("", 5, 5, 340, 20)
$Btn = GUICtrlCreateButton("Enter", 350, 5, 45, 20, 0x01) ; $BS_DEFPUSHBUTTON
$Edt = GUICtrlCreateEdit("", 5, 30, 390, 365, 0x200840) ; $ES_READONLY + $ES_AUTOVSCROLL + $WS_VSCROLL
GUICtrlSendMsg(-1, 0xC5, -1, 0) ; $EM_LIMITTEXT
GUISetState(@SW_SHOW)

$PID = Run(@ComSpec, "", @SW_HIDE, 3)
Sleep(100)
$Out = StdoutRead($PID)
GUICtrlSetData($Edt, DllCall('user32.dll', 'bool', 'OemToChar', 'str', $Out, 'str', $Out)[2])

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $Btn
      $Line = GUICtrlRead($Inp)
      If $Line = "cls" Then GUICtrlSetData($Edt, "")
      GUICtrlSetData($Inp, "")
      StdinWrite($PID, DllCall('user32.dll', 'bool', 'CharToOem', 'str', $Line, 'str', $Line)[2] & @CRLF)
      Sleep(100)
      $Out = StdoutRead($PID)
      GUICtrlSetData($Edt, DllCall('user32.dll', 'bool', 'OemToChar', 'str', $Out, 'str', $Out)[2], 1)
    EndSwitch
Until 0
 
Автор
G

Grx-Lin

Новичок
Сообщения
27
Репутация
0
InnI сказал(а):
Grx-Lin
Может, вам проще будет общаться с консолью, а не встраивать её?
Код:
$GUI = GUICreate("Console")
$Inp = GUICtrlCreateInput("", 5, 5, 340, 20)
$Btn = GUICtrlCreateButton("Enter", 350, 5, 45, 20, 0x01) ; $BS_DEFPUSHBUTTON
$Edt = GUICtrlCreateEdit("", 5, 30, 390, 365, 0x200840) ; $ES_READONLY + $ES_AUTOVSCROLL + $WS_VSCROLL
GUICtrlSendMsg(-1, 0xC5, -1, 0) ; $EM_LIMITTEXT
GUISetState(@SW_SHOW)

$PID = Run(@ComSpec, "", @SW_HIDE, 3)
Sleep(100)
$Out = StdoutRead($PID)
GUICtrlSetData($Edt, DllCall('user32.dll', 'bool', 'OemToChar', 'str', $Out, 'str', $Out)[2])

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $Btn
      $Line = GUICtrlRead($Inp)
      If $Line = "cls" Then GUICtrlSetData($Edt, "")
      GUICtrlSetData($Inp, "")
      StdinWrite($PID, DllCall('user32.dll', 'bool', 'CharToOem', 'str', $Line, 'str', $Line)[2] & @CRLF)
      Sleep(100)
      $Out = StdoutRead($PID)
      GUICtrlSetData($Edt, DllCall('user32.dll', 'bool', 'OemToChar', 'str', $Out, 'str', $Out)[2], 1)
    EndSwitch
Until 0
Это довольно интересно,но не уверен что так удобнее. Но спасибо. Я еще попробую и так и так как вы предложили.
 
Верх