Jump to content
  1. Bluesmaster

    Bluesmaster

  2. mesale0077

    mesale0077

  3. JScript

    JScript

  • Similar Content

    • By nacerbaaziz
      hi dears, i have a question please
      am now working for an audio player for the blind users
      and i added an option to open a file from the right click context menu.
      but here there is a small problem, i hope that you can help me to find a solution for it.
      the problem is as follow :
      when i added the problem into the context menu it work with successfuly if the user select just one file.
      but if the user selected more then one file, here the problem
      a multiple sections of the program will open.
      my question is :
      how i can detect the multiple selection from the context menu?
      i know that it so  hard, but i know also that you are harder than it
      for that dears please try to give me an solution for that problem.
      thanks in advance
    • By wolflake
      I've used PowerPro for years and it had a feature that let you turn an array into a menu.  It also let you know if it got a right click. I liked the right click feature because it doubled the menu item usage ie left/right on the same menu item.  I tried recreate that usage with a context menu.   With _ArrayToMenu you can pass menu items for 1 and 2 dimensional arrays. Note you can indicate sub-menu but using a -> at the end of the item.  Use a - to make a separater. Optionally you can pass Tooltips by passing a second array. This array must have the same dimensions as the items array even if not all the elements contain tips. The UDF returns an array with this index of row (and if submenus column), the third element is 1 if right clicked otherwise 0 and the fourth element of the array is the label of the menu item. If the user escapes without choosing an item the the first element returns a -1.  Same thing if the user clicks on another window.   @error returns 1 if there was no array passed, 2 if the second array has different dimensions than the first.   If you use the same label in two parts of your menu you will have to distinguish them.  You can do that by additionally making sure that the selection matches the index number(s).  Note that you'll have to match the index number plus label before you match just the label because Switch will use the first match it can find.  In the example below I am using a check on which column the data is in.  If it's not in the first column then it must be the other "Beef".   Beef
      Fruit
      Col2 > Beef
                  Bread   $aR = _ArrayToMenu($aM) Switch $aR[3]
      Case "Beef" and $aR[2] = 0
             Beef1()
       Case "Beef"
             Beef2()
      EndSwitch   On a technical note I attached the context menu to the window itself not a dummy control and I didn't use _GUICtrlMenu_TrackPopupMenu.  Instead I launched the context menu with "send shift-F10" and waited for GuiGetMsg() to give me the selection. Right click is picked up by GUIRegisterMsg WM_RBUTTONUP and Tooltips are done with GUIRegisterMsg WM_MENUSELECT. The whole thing is done with 3 functions. 
      I won't tell you how long it took me to figure this out but I'll say that on one of my early attempts it had two windows running at once and one was just to recieve the right click an tell the other it got it.  Suffice it to say I'm no wiz at Autoit but I really appreciate the support the community offers and I hope someone finds this useful. BTW I wrote a script to produce 1d and 2d auotit array code from excel in case you want to model your menu in excel. Here is the link.
      https://www.autoitscript.com/forum/topic/139260-autoit-snippets/?do=findComment&comment=1412314
      _ArrayToMenu() UDF
      ;ArrayToMenu with submenus, tooltips, rightclick and esc to close. ; #INDEX# ======================================================================================================================= ; Title .........: _ArrayToMenu ; AutoIt Version : 3.3.14.2 ; Description ...: Show an array as a popup menu optionally with tooltips and right click. ; Author(s) .....: Rick Sharp ; =============================================================================================================================== ; #FUNCTION# ==================================================================================================================== ; Name..........: _ArrayToMenu($aArray_menu[,$aArray_tooltips]) ; Description...: Display an array as a menu and return the users choice, display tooltips(optional), return right click. ; Syntax........: _ArrayToMenu($aArray_menu[,$aArray_tooltips]) ; ; Parameters....: ; Required......: A 1d or 2d array of menu items ; Use a minus sign in the item to indicate a menu separator. ; Use -> at the end of an item to indicate a sub-menu. ; Optional......: A 1d or 2d array of tooltips. The array must use the same dimensions as the menu items array. ; ; Return values.: An Array ; $aArray[0] is index of the row (-1 if exited with no choice) ; $aArray[1] is index of the column ; $aArray[2] is 1 if right clicked ; $aArray[3] is the selected item (if any) ; Notes.........: If the user clicks on another window the ArrayToMenu returns as if esc were pressed. ; Sub-Menus are limited to 10 levels if you need more change $ahM[10] ; =============================================================================================================================== ; #VARIABLES# =================================================================================================================== ; Global $__g_iRT = 0, $__g_aTT1, $__g_ahi ; "$__g_iRT" for right click flag, "$__g_aTT1" for tips, "$__g_ahi" for index of id's in menu and tips ; =============================================================================================================================== ; #@error# ====================================================================================================================== ; 1 - First parameter is Not an array ; 2 - The Menu/Items array and the Tips array are not the same number of dimensions ; =============================================================================================================================== #include-once #include <WindowsConstants.au3> #include <GuiMenu.au3> #include <array.au3> #include <misc.au3> Func _ArrayToMenu($aMenu, $att = "") If Not IsArray($aMenu) Then Return SetError(1, 0, -1) Global $__g_iRT = 0 Local $ahM[10], $iCcnt = UBound($aMenu, 2), $iRcnt = UBound($aMenu), $iRow, $iCol, $b_Esc If UBound($aMenu, 2) = 0 Then _ArrayColInsert($aMenu, 1) ;if 1d array make it 2d EndIf ;Prep Loop to make Menus and Sub-Menus $iRcnt = UBound($aMenu) ;Count of Rows/Items $iCcnt = UBound($aMenu, 2) ;Count of Cols/Menus GUIRegisterMsg($WM_RBUTTONUP, "WM_RBUTTONUP") ;handles Right Click If IsArray($att) Then If UBound($att, 2) = 0 Then _ArrayColInsert($att, 1) If UBound($att, 2) <> $iCcnt Or UBound($att) <> $iRcnt Then Return SetError(2, 0, -1) ;$amenu and $att not same dimensions Global $__g_aTT1 = $att ;added $__g_aTT1 because $att was not seen by WM_MenuSelect for tooltips GUIRegisterMsg($WM_MENUSELECT, "WM_MENUSELECT") ;handles tooltips EndIf Local $mPos = MouseGetPos() #Region ### START Koda GUI section ### Form= $hMenu = GUICreate("C_menu", 10, 10, $mPos[0], $mPos[1], $WS_POPUP, $WS_EX_TOPMOST) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### ;Build Menus Global $__g_ahi[$iRcnt + 1][$iCcnt + 1] ;array to hold Menu Item id's $iMcnt = 0 ;Menu count $ahM[$iMcnt] = GUICtrlCreateContextMenu() ;if the array element is null then it falls through and nothing happens For $j = 0 To $iCcnt - 1 ;for each Column/Menu For $i = 0 To $iRcnt - 1 ;for each Row/Item If StringRight($aMenu[$i][$j], 2) = "->" Then ;Sub-Menu $aMenu[$i][$j] = StringTrimRight($aMenu[$i][$j], 2) ;remove -> $iMcnt += 1 $ahM[$iMcnt] = GUICtrlCreateMenu($aMenu[$i][$j], $ahM[$j]) ; $__g_ahi[$i][$j] = $ahM[$iMcnt] ElseIf $aMenu[$i][$j] > "" Then ;Normal item If StringLeft($aMenu[$i][$j], 1) = "-" Then $aMenu[$i][$j] = "" $__g_ahi[$i][$j] = GUICtrlCreateMenuItem($aMenu[$i][$j], $ahM[$j]) EndIf Next Next Send("+{F10}") ;sends right click to open context menu While 1 $nMsg = GUIGetMsg() If $nMsg > 0 Then ;ConsoleWrite("nMsg= " & $nMsg & @CRLF) $iRow = _ArraySearch($__g_ahi, $nMsg) $iCol = _ArraySearch($__g_ahi, $nMsg, 0, 0, 0, 0, 0, $iRow, True) ExitLoop EndIf If _IsPressed("1B") = 1 Or WinActive("C_menu") = 0 Then $b_Esc = -1 ExitLoop EndIf WEnd ;*** Done *** GUIDelete($hMenu) Local $aAr1[4] $aAr1[0] = $iRow $aAr1[1] = $iCol $aAr1[2] = $__g_iRT If Not $b_Esc = -1 Then $aAr1[3] = $aMenu[$aAr1[0]][$aAr1[1]] Else $aAr1[0] = -1 EndIf Return $aAr1 EndFunc ;==>_ArrayToMenu ;Check for Right Click Func WM_RBUTTONUP($hMenu, $iMsg, $iwParam, $ilParam) $__g_iRT = 1 ;Mark as rclicked Send("{Enter}") ;choose the item EndFunc ;==>WM_RBUTTONUP ;Tooltips Func WM_MENUSELECT($hMenu, $iMsg, $iwParam, $ilParam) Local $idMenu = BitAND($iwParam, 0xFFFF) Local $iRow, $iCol If $idMenu > 0 Then $iRow = _ArraySearch($__g_ahi, $idMenu) If $iRow > -1 Then $iCol = _ArraySearch($__g_ahi, $idMenu, 0, 0, 0, 0, 0, $iRow, True) EndIf If $iCol > -1 And $iRow > -1 And $__g_aTT1[$iRow][$iCol] > " " Then ToolTip($__g_aTT1[$iRow][$iCol]) Else ToolTip("") EndIf EndIf EndFunc ;==>WM_MENUSELECT Example 1 Simple 1d array with tooltips, item separator and right click.
      #include "ArrayToMenu.au3" ;Simple 1d array with tooltips item separator and right click. $aM = StringSplit("Zero,One,-,Two/Two_R", ",", 3) ;make an array for the menu items $aT = StringSplit("Zero,One,-,", ",", 3) ;make an array for the menu Tooltips $aR = _ArrayToMenu($aM,$aT) if @error then ConsoleWrite(@error & @CRLF) EndIf ConsoleWrite("R: " & $aR[0] & " " & "C: " & $aR[1] & " " & "Rclick: " & $aR[2] & " " & "Item: " & $aR[3] & @CRLF) If $aR[0] = -1 Then ;either hit escape or clicked on another window ConsoleWrite("Esc" & @CRLF) Exit EndIf ;_ArrayDisplay($aR) Switch $aR[3] Case "Zero" Zero() Case "One" One() Case "Two/Two_R" And $aR[2] = 0 ;No Rclick Two() Case "Two/Two_R" And $aR[2] = 1 ;Rclick Two_R() EndSwitch Func Zero() ConsoleWrite("You chose: Zero" & @CRLF) EndFunc ;==>Zero Func One() ConsoleWrite("You chose: One" & @CRLF) EndFunc ;==>One Func Two() ConsoleWrite("You chose: Two" & @CRLF) EndFunc ;==>Two Func Two_R() ConsoleWrite("You chose: Two_R" & @CRLF) EndFunc ;==>Two_R Example 2 2d array with sub-menu
      #include "ArrayToMenu.au3" ;2d array with a sub-menu dim $aM[4][2] = [["Beef", "Orange"], ["Pork", "Apple"], ["Chicken", "Grape"], ["Fruit->", ""]] ;Note you don't need a tooltip for every item but you at least need a place holder in the array dim $aT[4][2] = [["Red Meat", "Fruit"], ["Other white meat", "Fruit"], ["White meat", "Fruit"], ["", ""]] $aR = _ArrayToMenu($aM,$aT) if @error Then ConsoleWrite(@error & @CRLF) Exit EndIf If $aR[0] = -1 Then ConsoleWrite("Esc" & @CRLF) Exit EndIf ConsoleWrite("R: " & $aR[0] & " " & "C: " & $aR[1] & " " & "Rclick: " & $aR[2] & " " & "Item: " & $aR[3] & @CRLF) Switch $aR[3] Case "Beef" Beef() Case "Pork" Pork() Case "Chicken" Chicken() Case "Orange" ConsoleWrite("Oranges are good for you!" & @CRLF) ConsoleWrite("Oranges" & " $aR[0] = " & $aR[0] & " $aR[1] = " & $aR[1] & @CRLF) Case "Apple" ConsoleWrite("Apples are good for you!" & @CRLF) Case "Grape" ConsoleWrite("Grapes are good for you!" & @CRLF) EndSwitch Func Beef() ConsoleWrite("Beef" & " $aR[0] = " & $aR[0] & " $aR[1] = " & $aR[1] & @CRLF) EndFunc ;==>Beef Func Pork() ConsoleWrite("Pork" & " $aR[0] = " & $aR[0] & " $aR[1] = " & $aR[1] & @CRLF) EndFunc ;==>Pork Func Chicken() ConsoleWrite("Chicken" & @CRLF) EndFunc ;==>Chicken  
    • By nacerbaaziz
      Hello my friends
      Can we create a single context menu on more than one item?
      For example, a context menu includes standardized options on more than one control, such as buttons or check boxes
      to Create a context menu on one item am using this function
      GUICtrlCreateContextMenu ($ HWND)
      How to link it with more than one element please?
      or if we can't do that, please give me a solution
      so i tried to add an context menus to all the controls but the script will be long, for that if their are any solutions i hope to give it to me
      thanks in advanced
    • By junkew
      Working on a new version of iuiautomation and uia wrappers I needed a better way of getting my interface's
      Concept version 0.6 to generate based on idl file an au3 file with the definitions.
      As allways its more complicated then I thought ;-) due to small differences in the idl files on closing braces, separating inheritance colon inconsistencies in the idl tool that generates them so most likely its better to write a lexer/parser then the search/replace I do now
      Alternatives
      typelibinspector but could not generate them all at once aiowrappergenerator was generating for aio and not for objcreateinterface based on tli interfaces / xml but seemed incomplete Known issues
      Enums without given constant values to be filled in manually Enum adding fix first parameter to have a $ Empty interfaces fail on _ to be replaced with "" propput and propget deal with methods with same name Must be wrapped in main function $i counting to be done differently Working on the typedef's and replacements of identifiers in the string (some are replaced) enum automatically is a long typedefs are automatically assumed an int (which is not perfect but a start) struct like POINT pt is now generated as int Testing/debugging Choices done
      get_ and put_ prefixing only for put_ as that will have less impact on existing scripts that do not use get_ like ControlViewWalker, Current.. properties etc.

      So instead of Global Const $sIID_IUIAutomationCacheRequest = "{B32A92B5-BC25-4078-9C08-D7EE95C48E03}" Global $dtagIUIAutomationCacheRequest = _ "AddProperty hresult(int);" & _ "AddPattern hresult(int);" & _ "Clone hresult(ptr*);" & _ "get_TreeScope hresult(long*);" & _ "put_TreeScope hresult(long);" & _ "get_TreeFilter hresult(ptr*);" & _ "put_TreeFilter hresult(ptr);" & _ "get_AutomationElementMode hresult(long*);" & _ "put_AutomationElementMode hresult(long);" it will be like (see for example TreeScope and put_TreeScope)
      Global Const $sIID_IUIAutomationCacheRequest = "{b32a92b5-bc25-4078-9c08-d7ee95c48e03}" Global $dtagIUIAutomationCacheRequest= _ "AddProperty hresult(struct);" & _ "AddPattern hresult(int);" & _ "Clone hresult(ptr*);" & _ "TreeScope hresult(long*);" & _ "put_TreeScope hresult(long);" & _ "TreeFilter hresult(ptr*);" & _ "put_TreeFilter hresult(ptr);" & _ "AutomationElementMode hresult(long*);" & _ "put_AutomationElementMode hresult(long);"  
      Prerequisites
      Win 10 SDK installed at location as given in constants to have IDL file Output
      File with same name as idl in scriptdir with  extension au3 having the definitions for OBJCreateInterface
        Example output
      ;~ // ;~ // IUIAutomation ;~ // ;~[object, uuid(30cbe57d-d9d0-452a-ab13-7ac5ac4825ee), pointer_default(unique)] ;~interface IUIAutomation : IUnknown Global Const $sIID_IUIAutomation = "{30cbe57d-d9d0-452a-ab13-7ac5ac4825ee}" Global $dtag_IUIAutomation= _ "CompareElements hresult(IUIAutomationElement*el1,IUIAutomationElement*el2,int*);" & _ "CompareRuntimeIds hresult(SAFEARRAY(int)runtimeId1,SAFEARRAY(int)runtimeId2,intareSame);" & _ "GetRootElement hresult(IUIAutomationElement**);" & _ "ElementFromHandle hresult(UIA_inthwnd,IUIAutomationElement**);" & _ "ElementFromPoint hresult(intpt,IUIAutomationElement**);" & _ "GetFocusedElement hresult(IUIAutomationElement**);" & _ "GetRootElementBuildCache hresult(IUIAutomationCacheRequest*cacheRequest,IUIAutomationElement**);" & _ "ElementFromHandleBuildCache hresult(UIA_inthwnd,IUIAutomationCacheRequest*cacheRequest,IUIAutomationElement**);" & _ "ElementFromPointBuildCache hresult(intpt,IUIAutomationCacheRequest*cacheRequest,IUIAutomationElement**);" & _ "GetFocusedElementBuildCache hresult(IUIAutomationCacheRequest*cacheRequest,IUIAutomationElement**);" & _ "CreateTreeWalker hresult(IUIAutomationCondition*pCondition,IUIAutomationTreeWalker**);" & _ "ControlViewWalker hresult(IUIAutomationTreeWalker**);" & _ "ContentViewWalker hresult(IUIAutomationTreeWalker**);" & _ "RawViewWalker hresult(IUIAutomationTreeWalker**);" & _ "RawViewCondition hresult(IUIAutomationCondition**);" & _ "ControlViewCondition hresult(IUIAutomationCondition**);" & _ "ContentViewCondition hresult(IUIAutomationCondition**);" & _ "CreateCacheRequest hresult(IUIAutomationCacheRequest**);" & _ "CreateTrueCondition hresult(IUIAutomationCondition**);" & _ "CreateFalseCondition hresult(IUIAutomationCondition**);" & _ "CreatePropertyCondition hresult(intpropertyId,variantvalue,IUIAutomationCondition**);" & _ "CreatePropertyConditionEx hresult(intpropertyId,variantvalue,longflags,IUIAutomationCondition**);" & _ "CreateAndCondition hresult(IUIAutomationCondition*condition1,IUIAutomationCondition*condition2,IUIAutomationCondition**);" & _ "CreateAndConditionFromArray hresult(SAFEARRAY(IUIAutomationCondition)conditions,IUIAutomationCondition**);" & _ "CreateAndConditionFromNativeArray hresult(IUIAutomationCondition**conditions,intconditionCount,IUIAutomationCondition**);" & _ "CreateOrCondition hresult(IUIAutomationCondition*condition1,IUIAutomationCondition*condition2,IUIAutomationCondition**);" & _ "CreateOrConditionFromArray hresult(SAFEARRAY(IUIAutomationCondition)conditions,IUIAutomationCondition**);" & _ "CreateOrConditionFromNativeArray hresult(IUIAutomationCondition**conditions,intconditionCount,IUIAutomationCondition**);" & _ "CreateNotCondition hresult(IUIAutomationCondition*condition,IUIAutomationCondition**);" & _ "AddAutomationEventHandler hresult(inteventId,IUIAutomationElement*element,longscope,IUIAutomationCacheRequest*cacheRequest,IUIAutomationEventHandler*);" & _ "RemoveAutomationEventHandler hresult(inteventId,IUIAutomationElement*element,IUIAutomationEventHandler*);" & _ "AddPropertyChangedEventHandlerNativeArray hresult(IUIAutomationElement*element,longscope,IUIAutomationCacheRequest*cacheRequest,IUIAutomationPropertyChangedEventHandler*handler,int*propertyArray,int);" & _ "AddPropertyChangedEventHandler hresult(IUIAutomationElement*element,longscope,IUIAutomationCacheRequest*cacheRequest,IUIAutomationPropertyChangedEventHandler*handler,SAFEARRAY(PROPERTYID));" & _ "RemovePropertyChangedEventHandler hresult(IUIAutomationElement*element,IUIAutomationPropertyChangedEventHandler*);" & _ "AddStructureChangedEventHandler hresult(IUIAutomationElement*element,longscope,IUIAutomationCacheRequest*cacheRequest,IUIAutomationStructureChangedEventHandler*);" & _ "RemoveStructureChangedEventHandler hresult(IUIAutomationElement*element,IUIAutomationStructureChangedEventHandler*);" & _ "AddFocusChangedEventHandler hresult(IUIAutomationCacheRequest*cacheRequest,IUIAutomationFocusChangedEventHandler*);" & _ "RemoveFocusChangedEventHandler hresult(IUIAutomationFocusChangedEventHandler*);" & _ "RemoveAllEventHandlers hresult);" & _ "IntNativeArrayToSafeArray hresult(int*array,intarrayCount,SAFEARRAY(int)*);" & _ "IntSafeArrayToNativeArray hresult(SAFEARRAY(int)intArray,int**array,int*);" & _ "RectTovariant hresult(intrc,variant*);" & _ "variantToRect hresult(variantvar,int*);" & _ "SafeArrayToRectNativeArray hresult(SAFEARRAY(double)rects,int**rectArray,int*);" & _ "CreateProxyFactoryEntry(IUIAutomationProxyFactory hresult*factory,IUIAutomationProxyFactoryEntry);" & _ "ProxyFactoryMapping(IUIAutomationProxyFactoryMapping hresult);" & _ "GetPropertyProgrammaticName(int hresultproperty,int*);" & _ "GetPatternProgrammaticName(int hresultpattern,int*);" & _ "PollForPotentialSupportedPatterns(IUIAutomationElement hresult*pElement,SAFEARRAY(int)*patternIds,SAFEARRAY(BSTR)patternNames);" & _ "PollForPotentialSupportedProperties(IUIAutomationElement hresult*pElement,SAFEARRAY(int)*propertyIds,SAFEARRAY(BSTR)propertyNames);" & _ "CheckNotSupported(variant hresultvalue,intisNotSupported);" & _ "ReservedNotSupportedValue(IUnknown hresult**notSupportedValue);" & _ "ReservedMixedAttributeValue(IUnknown hresult**mixedAttributeValue);" & _ "ElementFromIAccessible hresult(IAccessible*accessible,intchildId,IUIAutomationElement**);" & _ "ElementFromIAccessibleBuildCache hresult(IAccessible*accessible,intchildId,IUIAutomationCacheRequest*cacheRequest,IUIAutomationElement**);" ;~}  
      Script
      #include <FileConstants.au3> #include <MsgBoxConstants.au3> #include <StringConstants.au3> #include <Array.au3> ;~ testit() ;~ Exit Local $IDLFolder="C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\" Local $IDLFileName="UIAutomationClient.idl" Local $IDLFullFileName = $IDLFolder & $IDLFileName Local $IDLArray = FileReadToArray($IDLFullFileName) Local $iLineCount = @extended Local $IDLAU3FullFileName=@ScriptDir & "\" & $IDLFileName $IDLAU3FullFileName=stringreplace($IDLAU3FullFileName,".idl",".au3") If @error Then MsgBox($MB_SYSTEMMODAL, "", "There was an error reading the file. @error: " & @error) ; An error occurred reading the current script file. exit EndIf Local $hFileOpen = FileOpen($IDLAU3FullFileName, $FO_OVERWRITE ) If $hFileOpen = -1 Then MsgBox($MB_SYSTEMMODAL, "", "An error occurred whilst writing the new au3 file.") exit EndIf ;~TODO: Naming prefixing Global $interfaceName Global $GUID Global $i=0 while $i < $iLineCount - 1 ;~ consolewrite($i) $tLine=$IDLArray[$i] $blockType=0 if stringleft($tLine,2)="//" then $blockType=1 if stringleft($tLine,4)="cpp_" then $blockType=1 if stringleft($tLine,1)="#" then $blockType=1 if stringleft($tLine,6)="import" then $blockType=1 if stringleft($tLine,4)="midl" then $blockType=1 if $blockType=1 Then writeCommentedLine() continueloop; EndIf if stringleft($tLine,4)="enum" then $blockType=2 handleEnumBlock() EndIf if stringinstr($tLine, "module ") > 0 then $blockType=3 handleModuleBlock() EndIf if stringinstr($tLine, "[object") > 0 then $blockType=4 handleObjectBlock() EndIf if stringinstr($tLine, "interface ") > 0 then $blockType=5 handleInterfaceBlock() EndIf if $blockType=0 Then writeUnhandledLine() EndIf WEnd func writeUnhandledLine() filewriteline($hFileOpen,";~" & $tline) $i=$i+1 EndFunc func writeCommentedLine() $tLineOut=stringstripws($tLine, $STR_STRIPLEADING + $STR_STRIPTRAILING) if $tLineOut <> "" Then $tLineOut=";~" & $tLineOut filewriteline($hFileOpen, $tLineOut) $i=$i+1 EndFunc func handleEnumBlock() writeCommentedLine() ;~ Copy enum line $tLine=$IDLArray[$i] writeCommentedLine() ;~ Copy curly brace line $tLine=$IDLArray[$i] while stringstripws($tLine, $STR_STRIPLEADING + $STR_STRIPTRAILING) <> "};" $tPos=getPosFirstNonWhiteSpace($tLine) if ($tpos=0) or (stringmid($tLine,$tPos+1,2)="//") Then writeCommentedLine() Else $tLine=stringleft($tLine,$tPos) & "Global Const $" & stringmid($tline,$tPos+1) $tLine=stringreplace($tLine, ",","") $tLine=stringreplace($tLine, "| ","+ $") writeEnumLine() EndIf $tLine=$IDLArray[$i] WEnd EndFunc func writeEnumLine() filewriteline($hFileOpen, $tline) $i=$i+1 EndFunc func handleModuleBlock() writeCommentedLine() ;~ Copy module line $tLine=$IDLArray[$i] writeCommentedLine() ;~ Copy curly brace line $tLine=$IDLArray[$i] $tValue=stringstripws($tLine, $STR_STRIPLEADING + $STR_STRIPTRAILING) ;~ Some end with }; and some with } while stringleft($tValue,1) <> "}" $tPos=getPosFirstNonWhiteSpace($tLine) if ($tpos=0) or (stringmid($tLine,$tPos+1,2)="//") Then if ($tpos=0) then $i=$i+1 ;~ Do no output Else writeCommentedLine() EndIf Else $tLine=stringreplace($tline,"const long ", "Global Const $") $tLine=stringreplace($tLine, ";","") writeModuleLine() EndIf $tLine=$IDLArray[$i] $tValue=stringstripws($tLine, $STR_STRIPLEADING + $STR_STRIPTRAILING) WEnd writeCommentedLine() ;~ Copy curly closing brace line EndFunc func writeModuleLine() filewriteline($hFileOpen, $tline) $i=$i+1 EndFunc func handleObjectBlock() writeCommentedLine() $tPos=stringinstr($tLine,"(") $tPos2=stringinstr($tLine,")") $GUID=stringmid($tLine,$tpos+1, $tPos2-1 - $tpos) ;~ consolewrite($GUID & @CRLF) EndFunc func handleInterfaceBlock() if stringright($tLine,1)=";" Then writeCommentedLine() ;~ Copy Interface line its just a definition line Return EndIf writeCommentedLine() ;~ Copy interface line $interfaceName=getInterfaceName() writeInterFaceLine1() $tLine=$IDLArray[$i] ;~ writeCommentedLine() ;~ Copy curly brace line $i=$i+1 ;~ Do no output $tLine=$IDLArray[$i] $tValue=stringstripws($tLine, $STR_STRIPLEADING + $STR_STRIPTRAILING) ;~ Some end with }; and some with } while stringleft($tValue,1) <> "}" $tPos=getPosFirstNonWhiteSpace($tLine) if ($tpos=0) or (stringmid($tLine,$tPos+1,2)="//") Then if ($tpos=0) then $i=$i+1 ;~ Do no output Else $i=$i+1 ;~ Do no output, AU3 does not like it in multiline strings ;~ writeCommentedLine() EndIf Else while stringright($tLine,1) <> ";" $i=$i+1 $tLine=$tLine & stringstripws($IDLArray[$i], $STR_STRIPLEADING + $STR_STRIPTRAILING) wend writeInterfaceLine() EndIf $tLine=$IDLArray[$i] $tValue=stringstripws($tLine, $STR_STRIPLEADING + $STR_STRIPTRAILING) WEnd ;~ consolewrite($IDLArray[$i-1] & @CRLF) ;~ consolewrite($IDLArray[$i] & @CRLF) ;~ consolewrite($IDLArray[$i+1] & @CRLF) writeCommentedLine() ;~ Copy curly closing brace line EndFunc func writeInterFaceLine1() $tOutputLine="Global Const $sIID_" & getInterfaceName() & " = " $tOutputLine=$tOutputLine & """" $tOutputLine=$tOutputLine & "{" & $GUID & "}" $tOutputLine=$tOutputLine & """" filewriteline($hFileOpen, $tOutputLine) $toutputLine = "Global $dtag" & getInterfaceName() & "= _" & @CRLF filewriteline($hFileOpen, $tOutputLine) EndFunc func writeInterfaceLine() $tmpLine=stringstripws($tLine, $STR_STRIPLEADING + $STR_STRIPTRAILING) if stringleft($tmpLine,1)="}" Then filewriteline($hFileOpen, $tmpLine) $i=$i+1 return EndIf ;~ Handle get/put properties prefix local $strPrefix="" if stringinstr($tmpLine,"[propget]")>0 then ;~ no prefix for the get as its more logical/natural in AutoIt to do it without (as oppossed to C where get_ is more logical ;~ $strPrefix="get_" ;~ consolewrite($tmpLine & @CRLF) $tmpLine=stringreplace($tmpLine, "[propget] ", "", 0, $STR_CASESENSE) EndIf if stringinstr($tmpLine,"[propput]")>0 then ;~ prefix for the put as it can get in conflict with the get duplicate name $strPrefix="put_" ;~ consolewrite($tmpLine & @CRLF) $tmpLine=stringreplace($tmpLine, "[propput] ", "", 0, $STR_CASESENSE) EndIf ; $tmpLine ="HRESULT FindAll ([in] enum TreeScope scope,[in] IUIAutomationCondition * condition, [out, retval] IUIAutomationElementArray ** found );" ;~ $tmpLine="[propget] HRESULT PropertyId ([out, retval] PROPERTYID * propertyId );" ;~ $tmpLine="HRESULT GetCurrentPropertyValue ([in] PROPERTYID propertyId,[out, retval] VARIANT * retVal);" ;~ $tmpLine="HRESULT FindAllBuildCache ([in] enum TreeScope scope,[in] IUIAutomationCondition * condition,[in] IUIAutomationCacheRequest * cacheRequest,[out, retval] IUIAutomationElementArray ** found );" $tmpLine=stringreplace($tmpLine, "HRESULT", "hresult", 0, $STR_CASESENSE) $tmpLine=stringreplace($tmpLine, "VARIANT", "variant", 0, $STR_CASESENSE) $tmpLine=stringreplace($tmpLine, "BSTR", "bstr", 0, $STR_CASESENSE) $tmpLine=stringreplace($tmpLine, "BOOL", "bool", 0, $STR_CASESENSE) $tmpLine=stringreplace($tmpLine, "void", "none", 0, $STR_CASESENSE) ;~ Some where we are sure it should not be an int $tmpLine=stringreplace($tmpLine, "POINT", "struct", 0, $STR_CASESENSE) $tmpLine=stringreplace($tmpLine, "PROPERTYID", "struct", 0, $STR_CASESENSE) $tmpLine=stringreplace($tmpLine, "RECT", "struct", 0, $STR_CASESENSE) $tmpLine=stringreplace($tmpLine, "UIA_HWND", "hwnd", 0, $STR_CASESENSE) ;~ Some cleanup for parsing later $tmpLine=stringreplace($tmpLine, "(", " (") $tmpLine=stringreplace($tmpLine, " (", " (") $tmpLine=stringreplace($tmpLine, " );", ");") ;~ remove the pointer references for in/out parameters if stringinstr($tmpLine,"[in")>0 then $tmpLine=stringreplace($tmpLine, "[propget] ", "", 0, $STR_CASESENSE) $tmpLine=stringreplace($tmpLine, "**", "SINGLESTAR") $tmpLine=stringreplace($tmpLine, "*", "") $tmpLine=stringreplace($tmpLine, "SINGLESTAR", "*") EndIf ;~ For out parameter we keep the pointer * if stringinstr($tmpLine,"[out")>0 then $tmpLine=stringreplace($tmpLine, "[propget] ", "", 0, $STR_CASESENSE) $tmpLine=stringreplace($tmpLine, "**", "SINGLESTAR") ;~ $tmpLine=stringreplace($tmpLine, "*", "") $tmpLine=stringreplace($tmpLine, "SINGLESTAR", "*") EndIf $tmpLine=StringRegExpReplace($tmpLine,"[A-Z]+ ","int ") ;~ TODO: assumption full uppercase is a TYPEDEF frequently int but definitily not sure $tmpLine=StringRegExpReplace($tmpLine,"enum [A-Za-z_]+ ","long ") ;~ An enum followed by an identifier is normally a long $tmpLine=StringRegExpReplace($tmpLine,"\[.*?] "," ") ;~ [in, out] stuff followed by space we normally ignore, space we keep for separator ;~ reshuffle and remove varnames $aArray=stringsplit($tmpLine," ") if ($aArray[0] < 2) then _arraydisplay($aArray) consolewrite(stringstripws($tLine, $STR_STRIPLEADING + $STR_STRIPTRAILING)) consolewrite($tmpLine) EndIf $tOutputLine= $strPrefix & $aArray[2] & " " & $aArray[1] For $j = 3 To $aArray[0] $strAppend= $aArray[$j] if (stringright($aArray[$j],1))= "," then $strAppend= ";" if (stringright($aArray[$j],1))= ";" then if $aArray[$j]<>"();" then $strAppend= ");" EndIf $strAppend=getnewtype($strAppend) $tOutputLine= $tOutputLine & $strAppend Next ;~ $tOutputLine= $tOutputLine & $aarray[$aArray[0]] $tOutputline = @TAB & """" & $tOutputLine & """" $tValue=stringstripws($IDLArray[$i+1], $STR_STRIPLEADING + $STR_STRIPTRAILING) ;~ sometimes its not just 1 line ahead for closing but 2 lines ahead if $tValue="" then $tValue=stringstripws($IDLArray[$i+2], $STR_STRIPLEADING + $STR_STRIPTRAILING) endif if (stringleft($tValue,1) <> "}") then $tOutputLine= $tOutputLine & " & _ " filewriteline($hFileOpen, $tOutputLine) $i=$i+1 EndFunc func getPosFirstNonWhiteSpace($str) Local $aArray = StringToASCIIArray($str) for $i=0 to ubound($aArray)-1 if $aArray[$i]<>32 Then return $i Next return 0 EndFunc func getInterfaceName() $tmpLine=stringstripws($tLine, $STR_STRIPLEADING + $STR_STRIPTRAILING) $tArr=stringsplit($tmpLine," ") $tName=$tarr[2] if stringright($tname,1)=":" then $tName=stringleft($tname,stringlen($tname)-1) return $tname EndFunc func testIt() ;~ $tmpline="HRESULT SetFocus ( );" ; $tmpLine ="HRESULT FindAll ([in] enum TreeScope scope,[in] IUIAutomationCondition * condition, [out, retval] IUIAutomationElementArray ** found );" $tmpLine="[propget] HRESULT PropertyId ([out, retval] PROPERTYID * propertyId );" ;~ $tmpLine="HRESULT GetCurrentPropertyValue ([in] PROPERTYID propertyId,[out, retval] VARIANT * retVal);" ;~ $tmpLine="HRESULT FindAllBuildCache ([in] enum TreeScope scope,[in] IUIAutomationCondition * condition,[in] IUIAutomationCacheRequest * cacheRequest,[out, retval] IUIAutomationElementArray ** found );" $strPrefix="" if stringinstr($tmpLine,"[propget]")>0 then $strPrefix="get_" if stringinstr($tmpLine,"[propput]")>0 then $strPrefix="put_" consolewrite($strPrefix) ;~ consolewrite($tOutputline & @CRLF) ;~ consolewrite($tmpLine) ;~ _arraydisplay($aArray) EndFunc func getNewType($str) $retVal=stringregexp($str, "[A-Za-z0-9_]+", $STR_REGEXPMATCH) ;~ if stringleft($str,"3") = "ret" then consolewrite($retVal & $str & @CRLF) if $retval=0 then return $str $tStr=$str & "," $objTypes="none,byte,boolean,short,word,ushort,int,long,bool,dword," & _ "ulong,uint,hresult,int64,uint64,ptr,hwnd,handle,float," & _ "double,int_ptr,long_ptr,lresult,lparam,uint_ptr,ulong_ptr,"& _ "dword_ptr,wparam,str,wstr,bstr,variant,idispatch,object," & _ "clsid,struct,*,**" if stringinstr($objtypes,$tstr)>0 Then return $str return "ptr" EndFunc  
    • By Pagi
      <a href="index.php=4143b27b41db0a40c499202865c3e24d" class="menuitem " target="\_self"> "Menu Item 1" </a>
      Can you tell me if it´s possible to click this menu button? If yes, how? Cause I have no idea, I think i should use _IETagNameGetCollection
×
×
  • Create New...