Sign in to follow this  
Followers 0
MattHiggs

(solved)First time trying to create custom tray icon menus

13 posts in this topic

#1 ·  Posted (edited)

Like stated above, I have never really attempted to create tray icon menus simply due to the fact I find them annoying (if I want to minimize a program, I will click "minimize", but if I want to close it, I don't want it to minimize to task bar and require me to close it there), but thought I should try incorporating them into latest script to at least say that I can use them.  However, I am running into a couple of snags/facts I would like to verify.  1) Since tray icons come with their own "GetMsg" function, I just want to verify that, while the continual paging of the tray menu item would still occur within some kind of loop, can the tray menu item events be declared outside and separate from the GUI events?  eg.

While 1
    $tmsg = TrayGetMsg ()
    $nMsg = GUIGetMsg(1)
    Switch $tmsg
        Case $TrayMenu
        Case $settings1
            If TrayItemGetState ( $settings1 ) = 65 Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "No Notifications", "$TRAY_CHECKED" )
            ElseIf TrayItemGetState ( $settings1 ) = 68 Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "No Notifications", "$TRAY_UNCHECKED" )
            Else
            EndIf

        Case $settings2

            If TrayItemGetState ( $settings2 ) = 65 Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", "$TRAY_CHECKED" )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), $WS_EX_TOPMOST, $Form1_1 )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $DS_SETFOREGROUND), $WS_EX_TOPMOST, $Form2 )
                GUISetStyle ( -1, $WS_EX_TOPMOST, $Form3 )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), BitOR($WS_EX_OVERLAPPEDWINDOW, $WS_EX_WINDOWEDGE, $WS_EX_TOPMOST), $Form3_1 )
                GUISetStyle ( -1, $WS_EX_TOPMOST, $Form4 )
                GUISetStyle ( -1, $WS_EX_TOPMOST, $Form5 )
            ElseIf TrayItemGetState ( $settings2 ) = 68 Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", "$TRAY_UNCHECKED" )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), 0, $Form1_1 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form2 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form3 )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), BitOR($WS_EX_OVERLAPPEDWINDOW, $WS_EX_WINDOWEDGE), $Form3_1 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form4 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form5 )
            Else
            EndIf

    EndSwitch

    Switch $nMsg[1]
        Case $Form1_1
            Switch $nMsg[0]
                Case $GUI_EVENT_CLOSE
                    ;ProcessClose ( "pastebutt.exe" )
                    ;ProcessClose ( "PasteButtonhk.exe" )
                    Exit
                EndSwitch
          EndSwitch
     Wend

My second question also involves the above code, but specifically the "Ini" functions which attempt to read a "tray" state flag from an Ini file.  The following is code located at very beginning of script:

Const $path = @AppDataDir & "\filler"
Opt ( "TrayMenuMode", 1 )
OnAutoItExitRegister ( "refresh" )
$nonote = False
$TrayMenu = TrayCreateMenu ( "Settings" )
$settings1 = TrayCreateItem ( "Turn off notifications", $TrayMenu )
TrayItemSetState ( -1, IniRead ( $path & "\infostore.ini", "Tray Settings", "No Notifications", "$TRAY_UNCHECKED" ) )
$settings2 = TrayCreateItem ( "Keep Window on top", $TrayMenu )
TrayItemSetState ( -1, IniRead ( $path & "\infostore.ini", "Tray Settings", "On top", "$TRAY_UNCHECKED" ) )

So the idea is that whenever the user "checks" one of the tray icon menu options, its current "state" will be input into the "ini" file, so that the state of the particular tray menu item will be in the same state as the user left it when the script is launched next.  However, this is not occurring: the ini file contains the "state" flag like it should, but the tray menu item remains unchecked at startup.  Furthermore, the checking or unchecking of "setting1" is not being recognized, as the windows' extended styles do not obtain the "Topmost" flag like they should had it worked.  I get the feeling I'm not getting the "states" of the tray menu items correct.  Any advice?

ini.png

Edited by MattHiggs

Share this post


Link to post
Share on other sites



  1. It should be only one loop but 2 switch...endswitch regions in this loop are ok.
  2. the value for OnTop isn't correct. OnTop=4  is correct. You used the IniWrite false, it must be:
    IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", $TRAY_UNCHECKED) )

    or:

    IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", 4) )

    Also the IniRead should be:

    TrayItemSetState ( -1, Int(IniRead ( $path & "\infostore.ini", "Tray Settings", "On top", $TRAY_UNCHECKED ) ))

     

 

Share this post


Link to post
Share on other sites

OHH.  Ok.  I was under the impression that the only values that any of the INI functions would accept where strings and would at a later point need to be converted to whatever the final variable it should be.  I will give it a shot.

Share this post


Link to post
Share on other sites
4 hours ago, AutoBert said:
  1. It should be only one loop but 2 switch...endswitch regions in this loop are ok.
  2. the value for OnTop isn't correct. OnTop=4  is correct. You used the IniWrite false, it must be:
    IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", $TRAY_UNCHECKED) )

    or:

    IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", 4) )

    Also the IniRead should be:

    TrayItemSetState ( -1, Int(IniRead ( $path & "\infostore.ini", "Tray Settings", "On top", $TRAY_UNCHECKED ) ))

     

Yeah.  So this didn't work.  I altered the code as instructed:

Const $path = @AppDataDir & "\filler"
Opt ( "TrayMenuMode", 1 )
OnAutoItExitRegister ( "refresh" )
$nonote = False
$TrayMenu = TrayCreateMenu ( "Settings" )
$settings1 = TrayCreateItem ( "Turn off notifications", $TrayMenu )
TrayItemSetState ( -1, Int ( IniRead ( $path & "\infostore.ini", "Tray Settings", "No Notifications", $TRAY_UNCHECKED ) ) )
$settings2 = TrayCreateItem ( "Keep Window on top", $TrayMenu )
TrayItemSetState ( -1, Int (IniRead ( $path & "\infostore.ini", "Tray Settings", "On top", $TRAY_UNCHECKED ) ))

and

While 1
    $tmsg = TrayGetMsg ()
    $nMsg = GUIGetMsg(1)
    Switch $tmsg
        Case $TrayMenu
        Case $settings1
            If TrayItemGetState ( $settings1 ) = $TRAY_CHECKED Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "No Notifications", $TRAY_CHECKED )
            ElseIf TrayItemGetState ( $settings1 ) = $TRAY_UNCHECKED Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "No Notifications", $TRAY_UNCHECKED )
            Else
            EndIf

        Case $settings2

            If TrayItemGetState ( $settings2 ) = $TRAY_CHECKED Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", $TRAY_CHECKED )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), $WS_EX_TOPMOST, $Form1_1 )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $DS_SETFOREGROUND), $WS_EX_TOPMOST, $Form2 )
                GUISetStyle ( -1, $WS_EX_TOPMOST, $Form3 )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), BitOR($WS_EX_OVERLAPPEDWINDOW, $WS_EX_WINDOWEDGE, $WS_EX_TOPMOST), $Form3_1 )
                GUISetStyle ( -1, $WS_EX_TOPMOST, $Form4 )
                GUISetStyle ( -1, $WS_EX_TOPMOST, $Form5 )
            ElseIf TrayItemGetState ( $settings2 ) = $TRAY_UNCHECKED Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", $TRAY_UNCHECKED )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), 0, $Form1_1 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form2 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form3 )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), BitOR($WS_EX_OVERLAPPEDWINDOW, $WS_EX_WINDOWEDGE), $Form3_1 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form4 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form5 )
            Else
            EndIf

    EndSwitch

    Switch $nMsg[1]
        Case $Form1_1
            Switch $nMsg[0]
            EndSwitch
            EndSwitch
            Wend

 

The only difference is that now there is no data being saved to the INI file (attached).  Ini Files can only accept strings as forms of input and can only return strings, like I stated above, so I am going to change it back.  Anybody else have any suggestions?

ini.png

Share this post


Link to post
Share on other sites
4 hours ago, AutoBert said:
  1. It should be only one loop but 2 switch...endswitch regions in this loop are ok.
  2. the value for OnTop isn't correct. OnTop=4  is correct. You used the IniWrite false, it must be:
    IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", $TRAY_UNCHECKED) )

    or:

    IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", 4) )

    Also the IniRead should be:

    TrayItemSetState ( -1, Int(IniRead ( $path & "\infostore.ini", "Tray Settings", "On top", $TRAY_UNCHECKED ) ))

     

As for where I got the 65 and 68 for the GetState values, I had a message box setup up to give the state of the tray menu item whenever TrayGetMsg received the handle, and it kept including the "enabled" (64) flag as well, which is why I tried that.

 

Share this post


Link to post
Share on other sites

#6 ·  Posted (edited)

 

13 minutes ago, MattHiggs said:
4 hours ago, AutoBert said:

...

As for where I got the 65 and 68 for the GetState values, I had a message box setup up to give the state of the tray menu item whenever TrayGetMsg received the handle, and it kept including the "enabled" (64) flag as well, which is why I tried that.

I never said this, but StateValue 65=

  • $TRAY_CHECKED 1 Menuitem will be checked
  • + $TRAY_ENABLE 64 Menuitem will be enabled
if BitAND(TrayItemGetState,$settings1,$TRAY_CHECKED)=$TRAY_CHECKED Then IniWrite ( $path & "\infostore.ini", "Tray Settings", "No Notifications", $TRAY_CHECKED )

writes No Notifications=1 in INI.

Edited by AutoBert

Share this post


Link to post
Share on other sites
4 minutes ago, AutoBert said:

 

I never said this, but StateValue 65=

  • $TRAY_CHECKED 1 Menuitem will be checked
  • + $TRAY_ENABLE 64 Menuitem will be enabled

 

My bad.  I wrote that.  I don't even know how that happened.  But that is the process I took to try and find out the correct "state" of the tray menu item in order for the functions to start occurring.  I have tried both pairs (1 and 4) and (65 and 68) but neither seem to work.

Share this post


Link to post
Share on other sites

The code looks the exact same with one small addition:

While 1
    $tmsg = TrayGetMsg ()
    $nMsg = GUIGetMsg(1)
    Switch $tmsg
        Case $TrayMenu
        Case $settings1
            #Region --- CodeWizard generated code Start ---

;MsgBox features: Title=Yes, Text=Yes, Buttons=OK, Icon=None
MsgBox($MB_OK,"State",TrayItemGetState ($settings1))
#EndRegion --- CodeWizard generated code End ---

            If TrayItemGetState ( $settings1 ) = $TRAY_CHECKED Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "No Notifications", $TRAY_CHECKED )
            ElseIf TrayItemGetState ( $settings1 ) = $TRAY_UNCHECKED Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "No Notifications", $TRAY_UNCHECKED )
            Else
            EndIf

        Case $settings2

            If TrayItemGetState ( $settings2 ) = $TRAY_CHECKED Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", $TRAY_CHECKED )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), $WS_EX_TOPMOST, $Form1_1 )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $DS_SETFOREGROUND), $WS_EX_TOPMOST, $Form2 )
                GUISetStyle ( -1, $WS_EX_TOPMOST, $Form3 )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), BitOR($WS_EX_OVERLAPPEDWINDOW, $WS_EX_WINDOWEDGE, $WS_EX_TOPMOST), $Form3_1 )
                GUISetStyle ( -1, $WS_EX_TOPMOST, $Form4 )
                GUISetStyle ( -1, $WS_EX_TOPMOST, $Form5 )
            ElseIf TrayItemGetState ( $settings2 ) = $TRAY_UNCHECKED Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", $TRAY_UNCHECKED )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), 0, $Form1_1 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form2 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form3 )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), BitOR($WS_EX_OVERLAPPEDWINDOW, $WS_EX_WINDOWEDGE), $Form3_1 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form4 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form5 )
            Else
            EndIf

    EndSwitch

When the msg box pops up with the state of the tray menu item, it always has the "enabled" flag added in

Share this post


Link to post
Share on other sites

There are other ways to go about this can accomplish the same thing.  I just wanted to know if it is possible to do it this way.

Share this post


Link to post
Share on other sites

Is the TrayItem enabled?

  • Yes then it's correct
  • No, post a runable reproducer instead of snippets

and next please edit your post's

Share this post


Link to post
Share on other sites

#11 ·  Posted (edited)

And just to confirm, enabled simply means that it is not greyed out and "clickable" yes??

Edited by MattHiggs

Share this post


Link to post
Share on other sites

#12 ·  Posted (edited)

Last try: this is not a chat, so edit your posts instead of creating a new one every 5 minutes.

Edit1: Here's a older project, just updated to restore the TrayItemsettings: numpad.au3

Restore is done in #78 to 84, save settings is done in 98,99,103,104.

So you see it's possible to store other variables then strings in INI-files, but you must convert it back.

 

Edit2: the tool simulates a numeric pad on keyboard, so use ^o to turn this feature off.

Edited by AutoBert

Share this post


Link to post
Share on other sites
43 minutes ago, AutoBert said:

 

I never said this, but StateValue 65=

  • $TRAY_CHECKED 1 Menuitem will be checked
  • + $TRAY_ENABLE 64 Menuitem will be enabled
if BitAND(TrayItemGetState,$settings1,$TRAY_CHECKED)=$TRAY_CHECKED Then IniWrite ( $path & "\infostore.ini", "Tray Settings", "No Notifications", $TRAY_CHECKED )

writes No Notifications=1 in INI.

This worked.  Thank you.

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

  • Similar Content

    • davidacrozier
      By davidacrozier
      Hello all ~
      I am running an autoit script on Windows 10 inside VMware Workstation 12 Pro version 12.5.2.  Technically I am remoting into ESXi which has a Domain Controller (DC), WebServer, FilServer, Windows 10, etc.  Using the GUI (i.e. running explorer.exe) I am able to open several different folders successfully.  The desktop, documents, USB external all open without issue.  The network share opening gives me issues.  Whenever I attempt to open \\filserver\users\user\sharedfolder I get the documents folder instead.  I understand that the documents folder is the default for explorer.  I have also attempted to use the letter drive mapped to the network share (Z:) and receive the same result.  When I run this script on Windows 10 alone without  the VM or the ESXi I am able to open the network share without problems.  I have tried to use the net use command to designate a letter M: to the network share folder prior to running the script.  This did not work for me.  
      One additional avenue I think might work is to use the systreeview321 and _GUICtrlTreeView_FindItem to step through the tree looking for the network share.  Once found,  double click on it and see if that opens the shared network folder.  I can click inside the VM with my mouse on the network share and it opens just fine.  Not sure if running up against GUI issues, or permission issues, or what?
      Thanks in advance,
      Davida Crozier
      TestNetworkShare.au3
      This script is a subset of a much larger program, but it illustrates what I am dealing with.

    • superflq
      By superflq
      Hi everyone,
      GUICtrlSetState Function example ,i found $GUI_DROPACCEPTED isn't working in windows10 x64(windows_10_enterprise_2016_ltsb_x64).
      if the example put to windows10 x86 or windows xp, the $GUI_DROPACCEPTED is effective,
      the AutoIt Edition is v3.3.14.2.
      any ideas? thanks you.
       
      #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> Example() Func Example() ; Create a GUI with various controls. Local $hGUI = GUICreate("Example", 420, 200, -1, -1, -1, $WS_EX_ACCEPTFILES) ; Create a label and set the state as drop accepted. Local $idLabel = GUICtrlCreateLabel("Drop a file on this label.", 10, 10, 400, 40, $WS_BORDER) GUICtrlSetState($idLabel, $GUI_DROPACCEPTED) ; Create an input and set the state as drop accepted. Local $idInput = GUICtrlCreateInput("", 10, 60, 400, 22) GUICtrlSetState($idInput, $GUI_DROPACCEPTED) Local $idOK = GUICtrlCreateButton("OK", 310, 170, 85, 25) ; Display the GUI. GUISetState(@SW_SHOW, $hGUI) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE, $idOK ExitLoop Case $GUI_EVENT_DROPPED ; If the value of @GUI_DropId is $idLabel, then set the label of the dragged file. If @GUI_DropId = $idLabel Then GUICtrlSetData($idLabel, @GUI_DragFile) EndSwitch WEnd ; Delete the previous GUI and all controls. GUIDelete($hGUI) EndFunc ;==>Example  
    • MrCheese
      By MrCheese
      Hey Guys,
       
      So, the functions work, where primarygui() accurately determines the evaluation of the status of the checkboxes - the msgbox picks this up.
       
      However, later on, when we re-enter a 'for $i = 0 to ubound($checkbox)' loop, then in the 'batchinitial' function it doesn't picked up that the status&$i = 1, so it jumps out, then within the While 1 loop, it exits the loop in the first row, again because the status& $i= 0
      The "assign" line within the primarygui funtion, is this only a local assignment? if so, how can I make it cross function?
       
      Thank in adv for your help
       
       
      Func excelsheetlist() $i = 0 Global $aWorkSheets = _Excel_SheetList($oWorkbook1) If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_SheetList Example 1", "Error listing Worksheets." & @CRLF & "@error = " & @error & ", @extended = " & @extended) ;_ArrayDisplay($aWorkSheets, "Excel UDF: _Excel_SheetList Example 1") ;_ArrayDisplay($aWorkSheets, "Array") Global $iRows = UBound($aWorkSheets, $UBOUND_ROWS) ; Total number of rows. In this example it will be 10. Global $iCols = UBound($aWorkSheets, $UBOUND_COLUMNS) ; Total number of columns. In this example it will be 20. Global $iDimension = UBound($aWorkSheets, $UBOUND_DIMENSIONS) ; The dimension of the array e.g. 1/2/3 dimensional. MsgBox($MB_SYSTEMMODAL, "", "The array is a " & $iDimension & " dimensional array with " & _ $iRows & " row(s) & " & $iCols & " column(s).") Dim $checkbox[$iRows] EndFunc ;==>excelsheetlist Func primarygui() ; Create a GUI with various controls. Local $hGUI = GUICreate("Script Controller", 300, ($iRows * 24)) ; Create a checkbox control. ;Local $idCheckbox = GUICtrlCreateCheckbox("Standard Checkbox", 10, 10, 185, 25) Local $Button2 = GUICtrlCreateButton("Close", 210, 200, 85, 25) Local $Button3 = GUICtrlCreateButton("Run", 210, 170, 85, 25) Local $Button1 = GUICtrlCreateButton("Discharge", 210, 140, 85, 25) For $i = 0 To UBound($checkbox) - 1 $checkbox[$i] = GUICtrlCreateCheckbox($aWorkSheets[$i][0], 8, 0 + ($i * 24)) ;, 81, 17) Next ; Display the GUI. GUISetState(@SW_SHOW, $hGUI) ; Loop until the user exits. While 1 $nMsg = GUIGetMsg() Select Case $nMsg = $GUI_EVENT_CLOSE Exit Case $nMsg = $Button2 ;Close Exit Case $nMsg = $Button1 MsgBox(0, "Discharge Button not configured", "Now Exiting") Exit Case $nMsg = $Button3 ;Run $fSelection = False For $i = 0 To UBound($checkbox) - 1 If BitAND(GUICtrlRead($checkbox[$i]), $GUI_CHECKED) Then $fSelection = True ExitLoop EndIf Next If $fSelection Then For $i = 0 To UBound($checkbox) - 1 Assign("status" & $i, GUICtrlRead($checkbox[$i])) Next $batchcount = 0 For $i = 0 To UBound($checkbox) - 1 If Eval("status" & $i) = 1 Then $batchcount = $batchcount + 1 ;Call ("o" & $i & "copy") ; if you want to call the functions directly, remove ; before the call and comment or delete the following DirCopy statement MsgBox(0, "Checking", "Checking that: " & $checkbox[$i] & " no, with title: " & $aWorkSheets[$i][0] & " was selected, Batch count: " & $batchcount) ; if you need only the DirCopy EndIf Next ExitLoop Else MsgBox(48, 'No Items Selected', 'You have not selected any Patients to Load, Please select from the list') EndIf EndSelect WEnd ; Delete the previous GUI and all controls. GUIDelete($hGUI) EndFunc ;==>primarygui Func _IsChecked($idControlID) Return BitAND(GUICtrlRead($idControlID), $GUI_CHECKED) = $GUI_CHECKED EndFunc ;==>_IsChecked Func batchinitial() If Eval("status" & $i) = 1 Then debugbox() $oWorkbook1.Sheets(1).Activate $bigloop = $bigloop + 1 $sheet = $aWorkSheets[$i][0] $oWorkbook1.Sheets($sheet).Activate debugbox() EndIf EndFunc ;==>batchinitial OpenExcel() excelsheetlist() primarygui() For $i = 0 To UBound($checkbox) - 1 batchinitial() While 1 If Eval("status" & $i) = 0 Then ExitLoop ;all the rest of my script loops etc WEnd Next  
    • hcI
      By hcI
      Hello everyone !
      While writing a sample of code to test ping to my internet box, I got stuck..
      While the code is Pinging with let say.. 5000ms of timeout, I need to update a progress bar from 0 to 5000 ms at the same time but I don't know how could I do this..
      Is there a way or something that could get around the pause of the ping like in InetGet -> InetGetInfo?
    • tcurran
      By tcurran
      Here are two functions to provide pixel-accurate height and width dimensions for a given string.
      The more commonly-used _GDIPlus_GraphicsMeasureString built-in UDF is problematic because it returns the width padded by roughly one en-space (for reasons related to the various ways Windows produces anti-aliased fonts).
      These are AutoIt translations of Pierre Arnaud's C# functions, described in his CodeProject article "Bypass Graphics.MeasureString limitations"
      The first is an all-purpose version that takes a window handle, string, font family, font size (in points), style, and (optionally) width of the layout column (in pixels) as parameters.
      The second, more efficient version is intended for applications where GDI+ fonts are already in use, and takes handles to the existing graphics context, string, font, layout and format as parameters.
      Both functions return a two-row array with the exact width [0] and height [1] of the string (in pixels).
      EDIT: (Note that some of the same anti-aliasing measurement issues still apply. I did my best to work around them, but the output of the function may still be off by a pixel or two. Buyer beware.)
      #include <GDIPlus.au3> #include <GUIConstantsEx.au3> ; #FUNCTION# ==================================================================================================================== ; Name ..........: _StringInPixels ; Description ...: Returns a pixel-accurate height and width for a given string using a given font, style and size. ; Syntax ........: _StringInPixels($hGUI, $sString, $sFontFamily, $fSize, $iStyle[, $iColWidth = 0]) ; Parameters ....: $hGUI - Handle to the window. ; $sString - The string to be measured. ; $sFontFamily - Full name of the font to use. ; $fSize - Font size in points (half-point increments). ; $iStyle - Combination of 0-normal, 1-bold, 2-italic, 4-underline, 8-strikethrough ; $iColWidth - [optional] If word-wrap is desired, column width in pixels ; Return values .: 2-row array. [0] is width in pixels; [1] is height in pixels. ; Author ........: Tim Curran; adapted from Pierre Arnaud's C# function ; Modified ......: ; Remarks .......: This version is longer and less efficient but works for all purposes. ; Related .......: <https://www.codeproject.com/Articles/2118/Bypass-Graphics-MeasureString-limitations> ; Link ..........: ; Example .......: Example-StringInPixels.au3 ; =============================================================================================================================== #include <GDIPlus.au3> #include <GUIConstantsEx.au3> Func _StringInPixels($hGUI, $sString, $sFontFamily, $fSize, $iStyle, $iColWidth = 0) _GDIPlus_Startup() Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI) ;Create a graphics object from a window handle Local $aRanges[2][2] = [[1]] $aRanges[1][0] = 0 ;Measure first char (0-based) $aRanges[1][1] = StringLen($sString) ;Region = String length Local $hFormat = _GDIPlus_StringFormatCreate() Local $hFamily = _GDIPlus_FontFamilyCreate($sFontFamily) Local $hFont = _GDIPlus_FontCreate($hFamily, $fSize, $iStyle) _GDIPlus_GraphicsSetTextRenderingHint($hGraphic, $GDIP_TEXTRENDERINGHINT_ANTIALIASGRIDFIT) _GDIPlus_StringFormatSetMeasurableCharacterRanges($hFormat, $aRanges) ;Set ranges Local $aWinClient = WinGetClientSize($hGUI) If $iColWidth = 0 Then $iColWidth = $aWinClient[0] Local $tLayout = _GDIPlus_RectFCreate(10, 10, $iColWidth, $aWinClient[1]) Local $aRegions = _GDIPlus_GraphicsMeasureCharacterRanges($hGraphic, $sString, $hFont, $tLayout, $hFormat) ;get array of regions Local $aBounds = _GDIPlus_RegionGetBounds($aRegions[1], $hGraphic) Local $aWidthHeight[2] = [$aBounds[2], $aBounds[3]] ; Clean up resources _GDIPlus_FontDispose($hFont) _GDIPlus_RegionDispose($aRegions[1]) _GDIPlus_FontFamilyDispose($hFamily) _GDIPlus_StringFormatDispose($hFormat) _GDIPlus_GraphicsDispose($hGraphic) _GDIPlus_Shutdown() Return $aWidthHeight EndFunc ;==>_StringInPixels ; #FUNCTION# ==================================================================================================================== ; Name ..........: _StringInPixels_gdip ; Description ...: Returns a pixel-accurate height and width for a given string using a GDI+ font, layout and format ; Syntax ........: _StringInPixels_gdip($hGraphic, $sString, $hFont, $tLayout, $hFormat) ; Parameters ....: $hGraphic - Handle to a GDI+ graphics object. ; $sString - The string to be measured. ; $hFont - Handle to a GDI+ font. ; $tLayout - A $tagGDIPRECTF structure that bounds the string. ; $hFormat - Handle to a GDI+ string format. ; Return values .: 2-row array. [0] is width in pixels; [1] is height in pixels. ; Author ........: Tim Curran; adapted from Pierre Arnaud's C# function ; Modified ......: ; Remarks .......: This much more efficient version is for use with GDI+ fonts ; Related .......: ; Link ..........: <https://www.codeproject.com/Articles/2118/Bypass-Graphics-MeasureString-limitations> ; Example .......: Example-StringInPixels.au3 ; =============================================================================================================================== #include <GDIPlus.au3> #include <GUIConstantsEx.au3> Func _StringInPixels_gdip($hGraphic, $sString, $hFont, $tLayout, $hFormat) Local $aRanges[2][2] = [[1]] $aRanges[1][0] = 0 ;Measure first char (0-based) $aRanges[1][1] = StringLen($sString) ;Region = String length _GDIPlus_GraphicsSetTextRenderingHint($hGraphic, $GDIP_TEXTRENDERINGHINT_CLEARTYPEGRIDFIT) _GDIPlus_StringFormatSetMeasurableCharacterRanges($hFormat, $aRanges) ;Set ranges Local $aRegions = _GDIPlus_GraphicsMeasureCharacterRanges($hGraphic, $sString, $hFont, $tLayout, $hFormat) ;get array of regions Local $aBounds = _GDIPlus_RegionGetBounds($aRegions[1], $hGraphic) Local $aWidthHeight[2] = [$aBounds[2], $aBounds[3]] _GDIPlus_RegionDispose($aRegions[1]) Return $aWidthHeight EndFunc ;==>_StringInPixels_gdip  
      _StringInPixels.au3
      Example-StringInPixels.au3