Sign in to follow this  
Followers 0
Quip

issue with Run

5 posts in this topic

Hi first of all i'd like to know if windows uses an certain dll for the "Run" window (win+R). If so is it possible to intergrate that dll into my script?

Well the whole point of my program is to create an easy to update GUI to make certain tasks quicker for example: open a file, go to a certain url, open a directory etc etc.

The issues i have now is. If $data[$x][0] is an exe nothing happends or i get an acces violation popup.

if $data[$x][0] contains a folder path for example c:\program files (x86)\ i get an popup saying "C:\program is not accessible" and "acces denied". It seems like the command has an issue with paths with spaces.

The run code:

; Loop to see if the user leftclicks or rightclicks a button
        For $x = 0 To 14
            ; either runs the path with auto it or by CMD 'start'
            If $iMsg[0] = $ahIcons[$x] Then
                    If Not $data[$x][0] = "" Then
                    if StringInStr($data[$x][0], ".exe") > 0 Then
                        Run($data[$x][0])
                    Else
                        _RunDOS("start " & $data[$x][0])
                    EndIf
                EndIf
            EndIf

            ; Opens the settingswindow with settings for rightclicked button
            If $a[3] = 1 And $a[4] = $ahIcons[$x] Then
                $edit = $x
                ;$b = WinGetPos("Qcut")
                ;WinMove("Qcut - Settings","",$b[0],$b[1])
                GUISetState(@SW_SHOW, $sGui)
                GUICtrlSetData($Inp_name, $data[$x][3])
                GUICtrlSetData($Inp_Path, $data[$x][0])
                GUICtrlSetData($Inp_IconPath, $data[$x][1])
                GUICtrlSetData($Inp_IconNr, $data[$x][2])
                GUICtrlSetImage($Btn_Pre, $data[$x][1], $data[$x][2])
            EndIf
        Next
    WEnd
EndFunc   ;==>_Main

Whole code below:

#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <StaticConstants.au3>
#include <EditConstants.au3>
#include <Array.au3>
#include <Process.au3>

HotKeySet("+!d", "_hotkey")
Opt('MustDeclareVars', 1)
Opt("TrayMenuMode", 1)
Opt("SendKeyDelay", 0)

; Setting global variables
Global $hGui, $sGui, $hToggle = 1




_Main()
Func _Main()
    ; Setting Local variables
    Local $ahIcons[15], $data[15][4]
    Local $hFile, $hFileSel, $hNext, $x, $iCntHeight, $exititem, $temparray
    Local $iMsg, $sCurFilename, $sTmpFile, $settingsitem, $aboutitem, $a, $b
    Local $edit, $Inp_IconNr, $Inp_IconPath, $Inp_name, $Inp_Path, $Dial_iconpath, $Dial_path
    Local $Btn_cancel, $Btn_ok, $Btn_Pre, $iCntRow, $iCntCol, $iCurIndex = 1, $menu
    Local $hFilename = @SystemDir & "\shell32.dll"; Default file
    Local $Ini = @ScriptDir & "\settings.ini"; Path to settings ini


    ; Loop to create an 2dimensional array with all buttondata
    For $x = 0 To 14
        $data[$x][0] = IniRead($Ini, "Button" & $x, "path", "")
        $data[$x][1] = IniRead($Ini, "Button" & $x, "iconpath", "")
        $data[$x][2] = IniRead($Ini, "Button" & $x, "iconNr", "")
        $data[$x][3] = IniRead($Ini, "Button" & $x, "Name", "")

        If $data[$x][1] = "" Then $data[$x][1] = $hFilename
        If $data[$x][2] = "" Then $data[$x][2] = "240"
    Next



    ; Creating Tray menu
    $exititem = TrayCreateItem("Exit")

    ; Creating mainGui
    $hGui = GUICreate("Qcut", 200, $iCntHeight + 120, @DesktopWidth / 2 - 192, _
            @DesktopHeight / 2 - 235, -1)

    ; Buttonloop
    For $iCntRow = 0 To 2
        For $iCntCol = 0 To 4
            $iCurIndex = $iCntRow * 5 + $iCntCol
            $ahIcons[$iCurIndex] = GUICtrlCreateButton("", 40 * $iCntCol, 40 * $iCntRow, 40, 40, $BS_ICON)
            GUICtrlSetImage(-1, $data[$iCurIndex][1], $data[$iCurIndex][2])
            GUICtrlSetTip(-1,$data[$iCurIndex][3])
        Next
    Next

    ; Settings gui
    $sGui = GUICreate("Qcut - Settings", 255, 212, 400, 307, -1, -1, $hGui)
    $Inp_name = GUICtrlCreateInput("", 8, 25, 178, 21)
    GUICtrlCreateLabel("Name:", 8, 8, 35, 17)
    $Inp_IconNr = GUICtrlCreateInput("", 8, 65, 178, 21)
    GUICtrlCreateLabel("Icon Nr:", 8, 48, 42, 17)
    $Inp_Path = GUICtrlCreateInput("", 8, 105, 178, 21)
    GUICtrlCreateLabel("Path:", 8, 88, 29, 17)
    $Inp_IconPath = GUICtrlCreateInput("", 8, 145, 178, 21)
    GUICtrlCreateLabel("Icon Path;", 8, 128, 53, 17)
    $Btn_ok = GUICtrlCreateButton("Ok", 8, 176, 89, 25, $WS_GROUP)
    $Btn_cancel = GUICtrlCreateButton("Cancel", 96, 176, 89, 25, $WS_GROUP)
    $Dial_path = GUICtrlCreateButton("...", 192, 104, 25, 21, $WS_GROUP)
    $Dial_iconpath = GUICtrlCreateButton("...", 192, 144, 25, 21, $WS_GROUP)
    $Btn_Pre = GUICtrlCreateButton("", 208, 25, 40, 40, $BS_ICON)
    GUICtrlCreateLabel("Preview:", 207, 8, 45, 17)


    GUISetState(@SW_HIDE, $sGui)
    GUISwitch($hGui)
    GUISetState(@SW_SHOW)
    GUISetState()

    While 1
        ; All different variables for user-message handling
        $iMsg = GUIGetMsg(1)
        $a = GUIGetCursorInfo($hGui)
        _ArrayAdd($iMsg, TrayGetMsg())

        ; Main "Select" statement that handles other events
        Select
            Case $iMsg[0] = $Dial_path
                $sTmpFile = FileOpenDialog("Select file:", "c:/", "All (*.*)")
                If @error Then ContinueLoop
                GUICtrlSetData($Inp_Path, $sTmpFile)

                If StringInStr($sTmpFile, ".exe") > 0 Then
                    GUICtrlSetData($Inp_IconNr, "0")
                    GUICtrlSetData($Inp_IconPath, $sTmpFile)
                    GUICtrlSetImage($Btn_Pre, $sTmpFile, "0")
                    $temparray = StringSplit($sTmpFile, "\")
                    GUICtrlSetData($Inp_name, _ArrayPop($temparray))
                EndIf

            Case $iMsg[0] = $Dial_iconpath
                $sTmpFile = FileOpenDialog("Select file:", "c:/", "Icon files (*.dll;*.exe)")
                If @error Then ContinueLoop
                GUICtrlSetData($Inp_IconPath, $sTmpFile)
                GUICtrlSetData($Inp_IconNr, "0")

            Case $iMsg[0] = $Btn_ok
                ; Updates the $data array with changed data and then writes it to the ini,
                ; and updates to new icon image
                ;If GUICtrlRead($Inp_Path) <> $data[$edit][0] Or GUICtrlRead($Inp_IconPath) <> $data[$edit][1] Or GUICtrlRead($Inp_IconNr) <> $data[$edit][2] Or GUICtrlRead($Inp_name) <> $data[$edit][3] Then
                    If GUICtrlRead($Inp_IconNr) = "" Then GUICtrlSetData($Inp_IconNr, "240")
                    If GUICtrlRead($Inp_IconPath) = "" Then GUICtrlSetData($Inp_IconPath,$hFilename)

                    $data[$edit][0] = GUICtrlRead($Inp_Path)
                    $data[$edit][1] = GUICtrlRead($Inp_IconPath)
                    $data[$edit][2] = GUICtrlRead($Inp_IconNr)
                    $data[$edit][3] = GUICtrlRead($Inp_name)

                    IniWrite($Ini, "Button" & $edit, "path", $data[$edit][0])
                    IniWrite($Ini, "Button" & $edit, "iconpath", $data[$edit][1])
                    IniWrite($Ini, "Button" & $edit, "iconNr", $data[$edit][2])
                    IniWrite($Ini, "Button" & $edit, "name", $data[$edit][3])

                    GUISetState(@SW_HIDE, $sGui)
                    GUICtrlSetImage($ahIcons[$edit], $data[$edit][1], $data[$edit][2])
                    GUICtrlSetTip($ahIcons[$edit], $data[$edit][3])
                ;EndIf
            Case $iMsg[0] = $Btn_cancel
                GUISetState(@SW_HIDE, $sGui)
            Case $iMsg[0] = $Btn_Pre
                ; If user clicks preview button the Icon image changes to the current settings
                GUICtrlSetImage($Btn_Pre, GUICtrlRead($Inp_IconPath), GUICtrlRead($Inp_IconNr))
            Case $iMsg[5] = $exititem
                Exit
            Case $iMsg[0] = $GUI_EVENT_CLOSE And $iMsg[1] = $hGui
                Exit
            Case $iMsg[0] = $GUI_EVENT_CLOSE And $iMsg[1] = $sGui
                GUISetState(@SW_HIDE, $sGui)
        EndSelect



        ; Loop to see if the user leftclicks or rightclicks a button
        For $x = 0 To 14
            ; either runs the path with auto it or by CMD 'start'
            If $iMsg[0] = $ahIcons[$x] Then
                    If Not $data[$x][0] = "" Then
                    if StringInStr($data[$x][0], ".exe") > 0 Then
                        Run($data[$x][0])
                    Else
                        _RunDOS("start " & $data[$x][0])
                    EndIf
                EndIf
            EndIf

            ; Opens the settingswindow with settings for rightclicked button
            If $a[3] = 1 And $a[4] = $ahIcons[$x] Then
                $edit = $x
                ;$b = WinGetPos("Qcut")
                ;WinMove("Qcut - Settings","",$b[0],$b[1])
                GUISetState(@SW_SHOW, $sGui)
                GUICtrlSetData($Inp_name, $data[$x][3])
                GUICtrlSetData($Inp_Path, $data[$x][0])
                GUICtrlSetData($Inp_IconPath, $data[$x][1])
                GUICtrlSetData($Inp_IconNr, $data[$x][2])
                GUICtrlSetImage($Btn_Pre, $data[$x][1], $data[$x][2])
            EndIf
        Next
    WEnd
EndFunc   ;==>_Main


; Simple function for showing/hiding the program
Func _hotkey()
    If $hToggle = 1 Then
        $hToggle = 0
        GUISetState(@SW_HIDE, $hGui)
        GUISetState(@SW_HIDE, $sGui)
    Else
        $hToggle = 1
        GUISwitch($hGui)
        GUISetState(@SW_SHOW, $hGui)
    EndIf
EndFunc   ;==>_hotkey

Current ini file:

[Button0]
path=C:\Program Files (x86)\Codemasters\DiRT2\dirt2.exe
iconpath=C:\Program Files (x86)\Codemasters\DiRT2\dirt2_game.exe
iconNr=0
name=dirt2.exe

[Button1]
path=C:\Windows\notepad.exe
iconpath=C:\Windows\notepad.exe
iconNr=0
name=notepad.exe

[Button2]
path=C:\Program Files (x86)\mIRC\mirc.exe
iconpath=C:\Program Files (x86)\mIRC\mirc.exe
iconNr=0
name=mirc.exe

[Button3]
path=C:\Users\QuiP\Desktop\Qcut.exe
iconpath=C:\Users\QuiP\Desktop\Qcut.exe
iconNr=0
name=Qcut.exe

[Button4]
path=
iconpath=C:\Windows\system32\shell32.dll
iconNr=240
name=4

[Button5]
path=
iconpath=C:\Windows\system32\shell32.dll
iconNr=240
name=5

[Button6]
path=
iconpath=C:\Windows\system32\shell32.dll
iconNr=240
name=6

[Button7]
path=
iconpath=C:\Windows\system32\shell32.dll
iconNr=240
name=7

[Button8]
path=
iconpath=C:\Windows\system32\shell32.dll
iconNr=240
name=8

[Button9]
path=
iconpath=C:\Windows\system32\shell32.dll
iconNr=240
name=9

[Button10]
path=
iconpath=C:\Windows\system32\shell32.dll
iconNr=240
name=10

[Button11]
path=
iconpath=C:\Windows\system32\shell32.dll
iconNr=240
name=11

[Button12]
path=c:\program files (x86)\
iconpath=C:\Windows\system32\shell32.dll
iconNr=5
name=Autoit - examples

[Button13]
path=C:\Users\QuiP\Desktop\test.txt
iconpath=C:\Windows\system32\shell32.dll
iconNr=152
name=test.txt

[Button14]
path=D:\shaere
iconpath=C:\Windows\system32\shell32.dll
iconNr=5
name=Shaere

Thanks alot for any help! YES!

Share this post


Link to post
Share on other sites



It's running perfectly for me and I actually realy like it.

I have a few idea's that might help:

You can use #Requireadmin to solve permission issues.

_RunDos will block your program untill it returns (usually when the application is closed) instead you could use "Run(@ComSpec & " /C start " & $data[$x][0], "", @SW_HIDE)"

ShellExecute might be usefull if you want to be able to link files and it gives you an alternative for Run, which might help with your issues.

An input for parameters would be a nice addition. (You could also add them after the path, bit I think it would be nice.)

Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

Im glad that you liked it, and i will try those tips you gave me.

Edited by Quip

Share this post


Link to post
Share on other sites

any DOS command that refers to a file or folder with spaces should be surrounded by double quotations. (like 'dir "C:\Program Files\Common Files"'). In some cases you can get away without doing it, but its good practice to always use double quotes to surround files and folder names.

Share this post


Link to post
Share on other sites

the run window in windows is just ShellExecute

just use that and it will solve your problem

it will automatically decide what program to use.

you can put a link, program, folder, it all works.

legoman

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  
Followers 0