kwarizmi Posted January 31, 2008 Posted January 31, 2008 I am trying to create a program that has cmd.exe embedded into it. However, I would like for the cmd.exe window to be borderless.Here is my code so far.expandcollapse popup#include <GUIConstants.au3> #include <Constants.au3> Opt("GUIOnEventMode", 1) ; Change to OnEvent mode $mainWindow = GUICreate("Embed Cmd", 500, 500, 10, 10) GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked") GUISetState (@SW_SHOW) GUIRegisterMsg(0xF, "WM_PAINT") $pid = run("cmd.exe /T:F0 /k") ProcessWait ($pid) ; get the handle of the cmd window as i cannot be certain that there will be only one instance of the cmd running with the same window title or class $cmdHandle = _ProcessGetHWnd($pid, 2) Local $hWndChild = $cmdHandle[1][1] DllCall("user32.dll", "hwnd", "SetParent", "hwnd", $hWndChild, "hwnd", $mainWindow) DllCall("user32.dll", "long", "SetWindowLong", "hwnd", $hWndChild, "int", -20, "long", 0x80000000 + 0x40000000 + 0x40000) GuiSetStyle(BitOr($WS_POPUP, $WS_BORDER), '', $hWndChild) WinSetState($hWndChild, '', @SW_SHOW) WinMove($hWndChild, '', 1, 300, 498, 200) ; inifinite event loop While 1 ; sleep for 100 milliseconds (to not hog the cpu) sleep(100) ; end of event loop WEnd Func CLOSEClicked() ; take care of things to do when exiting exitCleanup() Exit EndFunc Func WM_PAINT($hWnd, $Msg, $wParam, $lParam) Sleep(100) DllCall("user32.dll", "int", "InvalidateRect", "hwnd", $hWnd, "ptr", 0, "int", 0) EndFunc ;==>WM_PAINT ;=============================================================================== ; ; Function Name: _ProcessGetHWnd ; Description: Returns the HWND(s) owned by the specified process (PID only !). ; ; Parameter(s): $iPid - the owner-PID. ; $iOption - Optional : return/search methods : ; 0 - returns the HWND for the first non-titleless window. ; 1 - returns the HWND for the first found window (default). ; 2 - returns all HWNDs for all matches. ; ; $sTitle - Optional : the title to match (see notes). ; $iTimeout - Optional : timeout in msec (see notes) ; ; Return Value(s): On Success - returns the HWND (see below for method 2). ; $array[0][0] - number of HWNDs ; $array[x][0] - title ; $array[x][1] - HWND ; ; On Failure - returns 0 and sets @error to 1. ; ; Note(s): When a title is specified it will then only return the HWND to the titles ; matching that specific string. If no title is specified it will return as ; described by the option used. ; ; When using a timeout it's possible to use WinWaitDelay (Opt) to specify how ; often it should wait before attempting another time to get the HWND. ; ; ; Author(s): Helge ; ;=============================================================================== Func _ProcessGetHWnd($iPid, $iOption = 1, $sTitle = "", $iTimeout = 2000) Local $aReturn[1][1] = [[0]], $aWin, $hTimer = TimerInit() While 1 ; Get list of windows $aWin = WinList($sTitle) ; Searches thru all windows For $i = 1 To $aWin[0][0] ; Found a window owned by the given PID If $iPid = WinGetProcess($aWin[$i][1]) Then ; Option 0 or 1 used If $iOption = 1 OR ($iOption = 0 And $aWin[$i][0] <> "") Then Return $aWin[$i][1] ; Option 2 is used ElseIf $iOption = 2 Then ReDim $aReturn[UBound($aReturn) + 1][2] $aReturn[0][0] += 1 $aReturn[$aReturn[0][0]][0] = $aWin[$i][0] $aReturn[$aReturn[0][0]][1] = $aWin[$i][1] EndIf EndIf Next ; If option 2 is used and there was matches then the list is returned If $iOption = 2 And $aReturn[0][0] > 0 Then Return $aReturn ; If timed out then give up If TimerDiff($hTimer) > $iTimeout Then ExitLoop ; Waits before new attempt Sleep(Opt("WinWaitDelay")) WEnd ; No matches SetError(1) Return 0 EndFunc ;==>_ProcessGetHWndI have included Helge's ProcessGetHWnd inside the code rather than include it just to make it easier to copy and runFor the most part, I am happy with how it works, but I really want to get rid of that border. Any ideas?Cheers!
kwarizmi Posted February 1, 2008 Author Posted February 1, 2008 I have created a solution to embedding a borderless command prompt in a window. First I make a child window with $WS_POPUP and embedd the commend prompt in that window. Then I size the command prompt window so that it is just bigger than the child window and the command prompt window's borders and title bar are clipped outside of the child window. Not an elegant solution, but it works. I can post the code if anyone is interested. Cheers!
kwarizmi Posted February 1, 2008 Author Posted February 1, 2008 Here is the updated code with the simulated borderless command prompt. expandcollapse popup#include <GUIConstants.au3> #include <Constants.au3> Opt("GUIOnEventMode", 1) ; Change to OnEvent mode $mainWindow = GUICreate("Embed Cmd", 500, 500, 10, 10) GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked") GUISetState (@SW_SHOW) GUIRegisterMsg(0xF, "WM_PAINT") ; create a borderless window that is a child to the main window $embedWindow = GUICREATE("", 477, 165, 15, 320, $WS_POPUP, -1, $mainWindow) DllCall("user32.dll", "hwnd", "SetParent", "hwnd", $embedWindow, "hwnd", $mainWindow) ; launch the command prompt (black on white, without the operating system message) $pid = run("cmd.exe /T:F0 /k") ProcessWait ($pid) ; get the handle of the cmd window as i cannot be certain that there will be only one instance of the cmd running with the same window title or class $cmdHandle = _ProcessGetHWnd($pid, 2) $hWndChild = $cmdHandle[1][1] ; make the command prompt window a child to the earlier created borderless child window DllCall("user32.dll", "hwnd", "SetParent", "hwnd", $hWndChild, "hwnd", $embedWindow) ; resize the command prompt window so that its bolder and title bar are outside the borderless child window ; giving the appearance of a borderless command prompt WinMove($hWndChild, '', -4, -30, 485, 206) WinSetState($hWndChild, '', @SW_SHOW) WinSetState($embedWindow, '', @SW_SHOW) ; inifinite event loop While 1 ; sleep for 100 milliseconds (to not hog the cpu) sleep(100) ; end of event loop WEnd Func CLOSEClicked() ; take care of things to do when exiting Winkill($hWndChild) Exit EndFunc Func WM_PAINT($hWnd, $Msg, $wParam, $lParam) Sleep(100) DllCall("user32.dll", "int", "InvalidateRect", "hwnd", $hWnd, "ptr", 0, "int", 0) EndFunc ;==>WM_PAINT ;=============================================================================== ; ; Function Name: _ProcessGetHWnd ; Description: Returns the HWND(s) owned by the specified process (PID only !). ; ; Parameter(s): $iPid - the owner-PID. ; $iOption - Optional : return/search methods : ; 0 - returns the HWND for the first non-titleless window. ; 1 - returns the HWND for the first found window (default). ; 2 - returns all HWNDs for all matches. ; ; $sTitle - Optional : the title to match (see notes). ; $iTimeout - Optional : timeout in msec (see notes) ; ; Return Value(s): On Success - returns the HWND (see below for method 2). ; $array[0][0] - number of HWNDs ; $array[x][0] - title ; $array[x][1] - HWND ; ; On Failure - returns 0 and sets @error to 1. ; ; Note(s): When a title is specified it will then only return the HWND to the titles ; matching that specific string. If no title is specified it will return as ; described by the option used. ; ; When using a timeout it's possible to use WinWaitDelay (Opt) to specify how ; often it should wait before attempting another time to get the HWND. ; ; ; Author(s): Helge ; ;=============================================================================== Func _ProcessGetHWnd($iPid, $iOption = 1, $sTitle = "", $iTimeout = 2000) Local $aReturn[1][1] = [[0]], $aWin, $hTimer = TimerInit() While 1 ; Get list of windows $aWin = WinList($sTitle) ; Searches thru all windows For $i = 1 To $aWin[0][0] ; Found a window owned by the given PID If $iPid = WinGetProcess($aWin[$i][1]) Then ; Option 0 or 1 used If $iOption = 1 OR ($iOption = 0 And $aWin[$i][0] <> "") Then Return $aWin[$i][1] ; Option 2 is used ElseIf $iOption = 2 Then ReDim $aReturn[UBound($aReturn) + 1][2] $aReturn[0][0] += 1 $aReturn[$aReturn[0][0]][0] = $aWin[$i][0] $aReturn[$aReturn[0][0]][1] = $aWin[$i][1] EndIf EndIf Next ; If option 2 is used and there was matches then the list is returned If $iOption = 2 And $aReturn[0][0] > 0 Then Return $aReturn ; If timed out then give up If TimerDiff($hTimer) > $iTimeout Then ExitLoop ; Waits before new attempt Sleep(Opt("WinWaitDelay")) WEnd ; No matches SetError(1) Return 0 EndFunc ;==>_ProcessGetHWnd In the end, it does what I want, but it seems like a sloppy solution. I wish I could get it so that the command prompt window would not display until it was repositions, but if I hide it on creation, it fails to become a child of the other window. rats. Cheers!
danielkza Posted February 1, 2008 Posted February 1, 2008 It would be a much more pratical and elegant soluction to create 2 edit controls to represent the output and input of the cmd.exe,and hide the true window. Like this(just a gui,not functional,made in Koda): #include <GUIConstants.au3> #Region ### START Koda GUI section ### Form= $Form2 = GUICreate("Form2", 356, 303, 303, 219) $Input1 = GUICtrlCreateInput("Input1", 10, 270, 251, 21) $Button1 = GUICtrlCreateButton("Button1", 270, 268, 75, 25, 0) $Edit1 = GUICtrlCreateEdit("", 10, 10, 335, 239) GUICtrlSetData(-1, "Edit1") GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $Form2 Case $Form2 Case $Form2 Case $Form2 Case $Input1 Case $Button1 Case $Edit1 EndSwitch WEnd
kwarizmi Posted February 2, 2008 Author Posted February 2, 2008 I thought about doing that but was unable to figure out a way to continuously get the output from the commandline into an edit box. How is that done?
LIMITER Posted February 2, 2008 Posted February 2, 2008 $CmdStr = GUICtrlRead($cmd) $CmdStr = StringStripWS($CmdStr, 3) If StringInStr($CmdStr, " ") Then $CmdStr = '"' & $CmdStr & '"' EndIf If StringLen($Params) Then $CmdStr &= " " & $Params EndIf Sleep(160) RunWait(@ComSpec & " /c " & $CmdStr & " >> C:\cmd-output.txt", "", @SW_HIDE) Sleep(800) $txt = FileRead("C:\cmd-output.txt") GUICtrlSetData($output,$txt) line.
kwarizmi Posted February 2, 2008 Author Posted February 2, 2008 I considered that also, but (unless I implemented it incorrectly) it will display the output of a command line program only after the program has finished executing. I need to display the output realtime, as the program is running. This is one of the main reasons I chose to embed cmd.exe into the main window. Cheers!
MadBoy Posted February 2, 2008 Posted February 2, 2008 I considered that also, but (unless I implemented it incorrectly) it will display the output of a command line program only after the program has finished executing. I need to display the output realtime, as the program is running. This is one of the main reasons I chose to embed cmd.exe into the main window.Cheers!Well getting the output instantly is not a problem. You can do that. THe problem is with applications that ask you questions or start up command line up that you need to interact with. Like for example netsh. Getting instant output from commands like ipconfig etc is not a problem and quite simple to do. I haven't yet checked how it's done in newest beta but with 3.2.10.0 it's working fine. My little company: Evotec (PL version: Evotec)
ReFran Posted February 2, 2008 Posted February 2, 2008 Perhaps this help.http://www.autoitscript.com/forum/index.ph...mp;hl=dosPromptReinhard
ResNullius Posted February 2, 2008 Posted February 2, 2008 (edited) This gets rid of the flash of the initial command prompt (although it still flashes on the taskbar) Also does away with the need for the _ProcessGetHWnd function. expandcollapse popup#include <GUIConstants.au3> #include <Constants.au3> Opt("GUIOnEventMode", 1) ; Change to OnEvent mode $mainWindow = GUICreate("Embed Cmd", 500, 500, 10, 10) GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked") GUISetState (@SW_SHOW) GUIRegisterMsg(0xF, "WM_PAINT") ; create a borderless window that is a child to the main window $embedWindow = GUICREATE("", 477, 165, 15, 320, $WS_POPUP, -1, $mainWindow) DllCall("user32.dll", "hwnd", "SetParent", "hwnd", $embedWindow, "hwnd", $mainWindow) ; launch the command prompt with a unique distinguishable title (black on white, without the operating system message) $cmdTitle = CHR(01) & CHR(02) $pid = run('cmd.exe /c start "' & $cmdTitle &'" /MIN cmd.exe /T:F0 /k',@ScriptDir,@SW_HIDE) WinWait($cmdTitle) ; get the handle of the cmd window to pass to SetParent; $hWndChild = WinGetHandle($cmdTitle) ; make the command prompt window a child to the earlier created borderless child window DllCall("user32.dll", "hwnd", "SetParent", "hwnd", $hWndChild, "hwnd", $embedWindow) ; resize the command prompt window so that its bolder and title bar are outside the borderless child window ; giving the appearance of a borderless command prompt WinMove($hWndChild, '', -4, -30, 485, 206) ;WinSetState($hWndChild, '', @SW_SHOW) ; no longer need this line WinSetState($embedWindow, '', @SW_SHOW) WinActivate($hWndChild) ; Added this line to make sure the embedded command prompt gets focus ; inifinite event loop While 1 ; sleep for 100 milliseconds (to not hog the cpu) sleep(100) ; end of event loop WEnd Func CLOSEClicked() ; take care of things to do when exiting Winkill($hWndChild) Exit EndFunc Func WM_PAINT($hWnd, $Msg, $wParam, $lParam) Sleep(100) DllCall("user32.dll", "int", "InvalidateRect", "hwnd", $hWnd, "ptr", 0, "int", 0) EndFunc ;==>WM_PAINT Only thing I can't figure out is why the command prompt cursor appears to be a little fatter than usual... Edit: spellin' korection Edited February 3, 2008 by ResNullius
kwarizmi Posted February 3, 2008 Author Posted February 3, 2008 ReFran,That looks good. I am torn between this method andhe original embedding cmd.exe method.Embedding seems to give a smoother looking scrolling of th output.Embedding gives awkward horizontal scroolling during output. rats.ResNullius,A big improvement. Thanks.On my system (XPSP2) the prompt is the same fatness as i usually see it. Perhaps it has something to do with me always setting the colours to black text on white background.Cheers
LIMITER Posted February 6, 2008 Posted February 6, 2008 The script doesn-t show a borderless command prompt on my pc ... XP SP2 Professional wierd or it's my pc ?
MrCreatoR Posted February 6, 2008 Posted February 6, 2008 Here is another version of embed Command Line prompt: expandcollapse popup#include <GUIConstants.au3> Opt("GUIOnEventMode", 1) Global $Init_Dir = "C:\" $Main_GUI = GUICreate("Embed Command Line Prompt", 550, 300, 10, 10) GUISetOnEvent($GUI_EVENT_CLOSE, "Quit") GUIRegisterMsg(0xF, "WM_PAINT") $iCmd_PID = Run(@ComSpec & " /k CD " & $Init_Dir, "", @SW_HIDE) ProcessWait($iCmd_PID) $Embed_hWnd = _GetHWndByPID($iCmd_PID) WinMove($Embed_hWnd, "", -2, -23, 549, 342) WinSetState($Embed_hWnd, "", @SW_SHOWMINIMIZED) GUISetState(@SW_SHOW, $Main_GUI) DllCall("user32.dll", "hwnd", "SetParent", "hwnd", $Embed_hWnd, "hwnd", $Main_GUI) While 1 Sleep(100) If WinActive($Main_GUI) Then WinActivate($Embed_hWnd) WEnd Func Quit() ProcessClose($iCmd_PID) Exit EndFunc Func _GetHWndByPID($iPID) Local $aWinList = WinList() For $i = 1 To UBound($aWinList)-1 If WinGetProcess($aWinList[$i][1]) = $iPID Then Return $aWinList[$i][1] Next Return 0 EndFunc Func WM_PAINT($hWnd, $Msg, $wParam, $lParam) DllCall("user32.dll", "int", "InvalidateRect", "hwnd", $hWnd, "ptr", 0, "int", 0) EndFunc The script doesn-t show a borderless command prompt on my pc ... XP SP2 Professional wierd or it's my pc ? It's depend on the Theme that used in your system, we can calculate it with GetSystemMetrics.  Spoiler Using OS: Win 7 Professional, Using AutoIt Ver(s): 3.3.6.1 / 3.3.8.1  AutoIt Russian Community My Work... Spoiler Projects: ATT - Application Translate Tool {new}| BlockIt - Block files & folders {new}| SIP - Selected Image Preview {new}| SISCABMAN - SciTE Abbreviations Manager {new}| AutoIt Path Switcher | AutoIt Menu for Opera! | YouTube Download Center! | Desktop Icons Restorator | Math Tasks | KeyBoard & Mouse Cleaner | CaptureIt - Capture Images Utility | CheckFileSize ProgramUDFs: OnAutoItErrorRegister - Handle AutoIt critical errors {new}| AutoIt Syntax Highlight {new}| Opera Library! | Winamp Library | GetFolderToMenu | Custom_InputBox()! | _FileRun UDF | _CheckInput() UDF | _GUIInputSetOnlyNumbers() UDF | _FileGetValidName() UDF | _GUICtrlCreateRadioCBox UDF | _GuiCreateGrid() | _PathSplitByRegExp() | _GUICtrlListView_MoveItems - UDF | GUICtrlSetOnHover_UDF! | _ControlTab UDF! | _MouseSetOnEvent() UDF! | _ProcessListEx - UDF | GUICtrl_SetResizing - UDF! | Mod. for _IniString UDFs | _StringStripChars UDF | _ColorIsDarkShade UDF | _ColorConvertValue UDF | _GUICtrlTab_CoverBackground | CUI_App_UDF | _IncludeScripts UDF | _AutoIt3ExecuteCode | _DragList UDF | Mod. for _ListView_Progress | _ListView_SysLink | _GenerateRandomNumbers | _BlockInputEx | _IsPressedEx | OnAutoItExit Handler | _GUICtrlCreateTFLabel UDF | WinControlSetEvent UDF | Mod. for _DirGetSizeEx UDF Examples: ScreenSaver Demo - Matrix included | Gui Drag Without pause the script | _WinAttach()! | Turn Off/On Monitor | ComboBox Handler Example | Mod. for "Thinking Box" | Cool "About" Box | TasksBar Imitation Demo Like the Projects/UDFs/Examples? Please rate the topic (up-right corner of the post header: Rating ) * === My topics === * ================================================== ==================================================    AutoIt is simple, subtle, elegant. © AutoIt Team
martin Posted February 6, 2008 Posted February 6, 2008 ; create a borderless window that is a child to the main window $embedWindow = GUICREATE("", 477, 165, 15, 320, $WS_POPUP, -1, $mainWindow) DllCall("user32.dll", "hwnd", "SetParent", "hwnd", $embedWindow, "hwnd", $mainWindow) A child window cannot have the POPUP style so that won't work (the boderless bit) Serial port communications UDF Includes functions for binary transmission and reception.printing UDF Useful for graphs, forms, labels, reports etc.Add User Call Tips to SciTE for functions in UDFs not included with AutoIt and for your own scripts.Functions with parameters in OnEvent mode and for Hot Keys One function replaces GuiSetOnEvent, GuiCtrlSetOnEvent and HotKeySet.UDF IsConnected2 for notification of status of connected state of many urls or IPs, without slowing the script.
ResNullius Posted February 7, 2008 Posted February 7, 2008 A child window cannot have the POPUP style so that won't work (the boderless bit)[excuse] I didn't really analyze the OP's code for those subtleties, I was just looking at suppresing the flash of the console on startup before it was made a child of the GUI. [/excuse] @MsCreatoR I like yours!
McGod Posted February 8, 2008 Posted February 8, 2008 Using Edit Control Functions, you can near mimic DOS like edit controls. expandcollapse popup#include <GuiConstants.au3> #include <WindowsConstants.au3> #include <AVIConstants.au3> #include <ButtonConstants.au3> #include <ComboConstants.au3> #include <Constants.au3> #include <DateTimeConstants.au3> #include <EditConstants.au3> #include <FontConstants.au3> #include <GDIPlusConstants.au3> #include <HeaderConstants.au3> #include <ImageListConstants.au3> #include <IPAddressConstants.au3> #include <ListBoxConstants.au3> #include <ListViewConstants.au3> #include <MemoryConstants.au3> #include <MenuConstants.au3> #include <ProgressConstants.au3> #include <RebarConstants.au3> ;~ #include <ScrollBarConstants.au3> #include <SecurityConstants.au3> #include <SliderConstants.au3> #include <StaticConstants.au3> #include <StructureConstants.au3> #include <TabConstants.au3> #include <ToolbarConstants.au3> #include <TooltipConstants.au3> #include <TreeviewConstants.au3> #include <UpDownConstants.au3> #include <WindowsConstants.au3> #include <GUIEdit.au3> #Region ### START Koda GUI section ### Form= $Form1 = GUICreate("Form1", 634, 453, 193, 115) HotKeySet("{BACKSPACE}", "Testet") HotKeySet("{ENTER}", "Testt") HotKeySet("{DEL}", "Testt") $Edit1 = GUICtrlCreateEdit("", 0, 0, 633, 449) GUICtrlSetData(-1, @SystemDir & ">") GUICtrlSetFont(-1, 8, 400, 0, "Lucida Console") GUICtrlSetColor(-1, 0xFFFFFF) GUICtrlSetBkColor(-1, 0x000000) GUISetState(@SW_SHOW) Global $sLastLine = _GUICtrlEdit_GetTextLen($Edit1) #EndRegion ### END Koda GUI section ### While 1 Sleep(10) _GUICTrlEdit_SetSel($Edit1, _GUICtrlEdit_GetTextLen($Edit1)+1, _GUICtrlEdit_GetTextLen($Edit1)+1) $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd Func Testt () Local $sCmd = StringMid(GUICtrlRead($Edit1), $sLastLine+1) _GUICtrlEdit_BeginUpdate($Edit1) recall_command($sCmd) _GUICtrlEdit_EndUpdate($Edit1) _GUICtrlEdit_AppendText($Edit1, @SystemDir & ">") Global $sLastLine = _GUICtrlEdit_GetTextLen($Edit1) MsgBox(1, "", $sLastLine) EndFunc Func recall_command($info) $cmdinfo = Run(@ComSpec & " /c " & $info, @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD + $STDIN_CHILD) While 1 $line = StdoutRead($cmdinfo) If @error Then Return If $line = "" Then ContinueLoop GUICtrlSetData($Edit1, GUICtrlRead($Edit1) & @CRLF & $line); WEnd EndFunc ;==>recall_command Func Testet () Local $sSel = _GUICtrlEdit_GetSel($Edit1) If $sSel[0] <= $sLastLine Then Return If $sSel[1] - $sSel[0] = 0 Then GUICtrlSetData($Edit1, StringTrimRight(GUICtrlRead($Edit1), 1)) Else _GUICtrlEdit_ReplaceSel($Edit1, "") EndIf EndFunc bit bugged, and very rough. [indent][center][u]Formerly Chip[/u][/center]~UDFs~[/indent][u]IRC.au3 - Allows you to connect to IRC ServersINetCon.au3 - Connects/Disconnects/Check Status of InternetHardware Key - Creates a unique hardware hashScriptComm - Allows you to communicate between scripts using WM_COPYDATA[/u][indent]~Programs~[/indent][indent]SimonAu3ForumsIRC Bot~Web Site~Web Autoit Example[/indent][indent][b][/b][/indent][u][/u]
yucatan Posted June 3, 2009 Posted June 3, 2009 A child window cannot have the POPUP style so that won't work (the boderless bit)hey guys i need some help with the embedding of the cmd.exethis things i want but i cant get it workingi want the popup style so that i only see the cmd bar and not a above titbar of autoitif i move the cmd windows with my mouse (so in my autoit aplication) i wannt move my entire windows not only the cmd.execan somebody help me on this one pleas
martin Posted June 3, 2009 Posted June 3, 2009 hey guys i need some help with the embedding of the cmd.exethis things i want but i cant get it workingi want the popup style so that i only see the cmd bar and not a above titbar of autoitif i move the cmd windows with my mouse (so in my autoit aplication) i wannt move my entire windows not only the cmd.execan somebody help me on this one pleas Can you show what you have so far? Serial port communications UDF Includes functions for binary transmission and reception.printing UDF Useful for graphs, forms, labels, reports etc.Add User Call Tips to SciTE for functions in UDFs not included with AutoIt and for your own scripts.Functions with parameters in OnEvent mode and for Hot Keys One function replaces GuiSetOnEvent, GuiCtrlSetOnEvent and HotKeySet.UDF IsConnected2 for notification of status of connected state of many urls or IPs, without slowing the script.
armoros Posted April 5, 2012 Posted April 5, 2012 (edited) 4 years later and i cant compile this script, is this for an older autoit version ? what should i change ? or i am just stupid ? i realy need this as a base to learn. Here is the updated code with the simulated borderless command prompt. expandcollapse popup#include #include Opt("GUIOnEventMode", 1) ; Change to OnEvent mode $mainWindow = GUICreate("Embed Cmd", 500, 500, 10, 10) GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked") GUISetState (@SW_SHOW) GUIRegisterMsg(0xF, "WM_PAINT") ; create a borderless window that is a child to the main window $embedWindow = GUICREATE("", 477, 165, 15, 320, $WS_POPUP, -1, $mainWindow) DllCall("user32.dll", "hwnd", "SetParent", "hwnd", $embedWindow, "hwnd", $mainWindow) ; launch the command prompt (black on white, without the operating system message) $pid = run("cmd.exe /T:F0 /k") ProcessWait ($pid) ; get the handle of the cmd window as i cannot be certain that there will be only one instance of the cmd running with the same window title or class $cmdHandle = _ProcessGetHWnd($pid, 2) $hWndChild = $cmdHandle[1][1] ; make the command prompt window a child to the earlier created borderless child window DllCall("user32.dll", "hwnd", "SetParent", "hwnd", $hWndChild, "hwnd", $embedWindow) ; resize the command prompt window so that its bolder and title bar are outside the borderless child window ; giving the appearance of a borderless command prompt WinMove($hWndChild, '', -4, -30, 485, 206) WinSetState($hWndChild, '', @SW_SHOW) WinSetState($embedWindow, '', @SW_SHOW) ; inifinite event loop While 1 ; sleep for 100 milliseconds (to not hog the cpu) sleep(100) ; end of event loop WEnd Func CLOSEClicked() ; take care of things to do when exiting Winkill($hWndChild) Exit EndFunc Func WM_PAINT($hWnd, $Msg, $wParam, $lParam) Sleep(100) DllCall("user32.dll", "int", "InvalidateRect", "hwnd", $hWnd, "ptr", 0, "int", 0) EndFunc ;==>WM_PAINT ;=============================================================================== ; ; Function Name: _ProcessGetHWnd ; Description: Returns the HWND(s) owned by the specified process (PID only !). ; ; Parameter(s): $iPid - the owner-PID. ; $iOption - Optional : return/search methods : ; 0 - returns the HWND for the first non-titleless window. ; 1 - returns the HWND for the first found window (default). ; 2 - returns all HWNDs for all matches. ; ; $sTitle - Optional : the title to match (see notes). ; $iTimeout - Optional : timeout in msec (see notes) ; ; Return Value(s): On Success - returns the HWND (see below for method 2). ; $array[0][0] - number of HWNDs ; $array[x][0] - title ; $array[x][1] - HWND ; ; On Failure - returns 0 and sets @error to 1. ; ; Note(s): When a title is specified it will then only return the HWND to the titles ; matching that specific string. If no title is specified it will return as ; described by the option used. ; ; When using a timeout it's possible to use WinWaitDelay (Opt) to specify how ; often it should wait before attempting another time to get the HWND. ; ; ; Author(s): Helge ; ;=============================================================================== Func _ProcessGetHWnd($iPid, $iOption = 1, $sTitle = "", $iTimeout = 2000) Local $aReturn[1][1] = [[0]], $aWin, $hTimer = TimerInit() While 1 ; Get list of windows $aWin = WinList($sTitle) ; Searches thru all windows For $i = 1 To $aWin[0][0] ; Found a window owned by the given PID If $iPid = WinGetProcess($aWin[$i][1]) Then ; Option 0 or 1 used If $iOption = 1 OR ($iOption = 0 And $aWin[$i][0] <> "") Then Return $aWin[$i][1] ; Option 2 is used ElseIf $iOption = 2 Then ReDim $aReturn[UBound($aReturn) + 1][2] $aReturn[0][0] += 1 $aReturn[$aReturn[0][0]][0] = $aWin[$i][0] $aReturn[$aReturn[0][0]][1] = $aWin[$i][1] EndIf EndIf Next ; If option 2 is used and there was matches then the list is returned If $iOption = 2 And $aReturn[0][0] > 0 Then Return $aReturn ; If timed out then give up If TimerDiff($hTimer) > $iTimeout Then ExitLoop ; Waits before new attempt Sleep(Opt("WinWaitDelay")) WEnd ; No matches SetError(1) Return 0 EndFunc ;==>_ProcessGetHWnd In the end, it does what I want, but it seems like a sloppy solution. I wish I could get it so that the command prompt window would not display until it was repositions, but if I hide it on creation, it fails to become a child of the other window. rats. Cheers! Edited April 5, 2012 by armoros [font="verdana, geneva, sans-serif"] [/font]
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now