Lauffähig ist das ganze sowieso erst wenn man ArcMap installiert hat und ich glaube das das die wenigsten von euch haben.
Aber ok, hier ist das ganze Script:
#include "UIAWrappers.au3"
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <GuiToolbar.au3>
#include <MsgBoxConstants.au3>
#include <GuiTreeView.au3>
#include <File.au3>
#include <ScreenCapture.au3>
OnAutoItExitRegister ("_exit()")
AutoItSetOption("WinTitleMatchMode", 2)
Global $program_name = "test"
$ParentTitle = "ArcMap"
$hParentWindow = WinGetHandle($ParentTitle)
GLOBAL $XTPToolBar = _WinAPI_GetClassName($hParentWindow)
Global $random = Random(10000, 50000, 1)
While Not WinExists($hParentWindow)
Sleep(200)
WEnd
$fleft = 650
$ftop = 5
$winf7 = GUICreate("F7", 30, 30, $fleft, $ftop, $WS_POPUP)
GUISetBkColor(0xff0000)
$Btnf7 = GUICtrlCreateButton("F7", 1, 1, 28, 28)
DllCall("user32.dll", "int", "SetParent", "hwnd", $winf7, "hwnd", $hParentWindow)
GUISetState()
;~ AdlibRegister("redrawButton", 500)
$first_time = 1
While WinExists($hParentWindow)
If GUIGetMsg() = $Btnf7 Then
;~ $img = _freeze()
;~ _first_Startup()
$pyHandle = _start_python()
_createPython("add_shp")
_exec("add_shp.py", $pyHandle)
_start_edit("poly")
Sleep(1000)
;~ WinSetState("Python", "", @SW_SHOW)
;~ Sleep(5000)
;~ _unfreeze($img)
;~ WinSetState("Python", "", @SW_SHOW)
EndIf
WEnd
WinKill($winf7)
Func redrawButton()
_WinAPI_InvalidateRect($winf7)
EndFunc
Func _first_Startup()
If $first_time = 1 Then
$PyButton="Python"
$oPyButton=_UIA_getFirstObjectOfElement($UIA_oDesktop,"class:=" & $XTPToolBar, $treescope_children)
if isobj($oPyButton) Then
_UIA_DumpThemAll($oPyButton,$treescope_subtree)
$oButton=_UIA_getFirstObjectOfElement($oPyButton,"name:=" & $PyButton, $treescope_subtree)
$oInvokeP=_UIA_getpattern($oButton,$UIA_InvokePatternID)
$oInvokeP.Invoke
Sleep(400)
$first_time = 0
Run("kill.exe")
EndIf
EndIf
EndFunc
Func _start_python()
WinKill("Python")
$PyButton="Python"
$oPyButton=_UIA_getFirstObjectOfElement($UIA_oDesktop,"class:=" & $XTPToolBar, $treescope_children)
if isobj($oPyButton) Then
_UIA_DumpThemAll($oPyButton,$treescope_subtree)
$oButton=_UIA_getFirstObjectOfElement($oPyButton,"name:=" & $PyButton, $treescope_subtree)
$oInvokeP=_UIA_getpattern($oButton,$UIA_InvokePatternID)
$oInvokeP.Invoke
WinWaitActive("Python")
WinSetState("Python", "", @SW_HIDE)
$pyHandle = WinGetHandle("Python")
Return $pyHandle
EndIf
EndFunc
Func _send_simple($send, $handle)
WinActivate("Python")
ControlCommand($handle, "", "", "EditPaste", $send)
ControlSend($handle, "", "", @CR)
AutoItSetOption("WinDetectHiddenText", 1)
Return(WinGetText($handle))
EndFunc
Func _start_edit_old()
WinActivate($hParentWindow)
Send("{ALTDOWN}ee{ALTUP}")
;~ Sleep(100)
Send("{ENTER}")
;~ Sleep(100)
Send("{ENTER}")
;~ Sleep(100)
$t1 = WinGetHandle("Bearbeitung starten")
ControlSend($t1, "", "SysListView321", "temp")
;~ Sleep(100)
Send("{ENTER}")
EndFunc
Func _start_edit($shp_name)
Local $class = _getClasses($shp_name)
WinActivate($hParentWindow)
$t2 = ControlGetHandle($hParentWindow, "", $class)
$t3 = _GUICtrlTreeView_FindItem($t2, $shp_name)
WinActivate($t2)
_GUICtrlTreeView_SelectItem($t2, $t3)
Send("{APPSKEY}")
Send("{UP}{UP}{UP}{UP}{UP}{UP}{UP}{UP}{RIGHT}{ENTER}")
EndFunc
Func _getClasses($shp_name)
Local $count = 0
Local $SysTreeView = 0
$all = WinGetClassList($hParentWindow)
$str = StringSplit($all, @CRLF)
For $i = 0 To $str[0]
If $str[$i] = "SysTreeView32" Then
$count += 1
EndIf
Next
For $i = 1 To $count
$t1 = ControlGetHandle($hParentWindow, "", "SysTreeView32"&$i)
$t2= _GUICtrlTreeView_FindItem($t1, $shp_name)
If NOT @error Then $SysTreeView = "SysTreeView32"&$i
Next
Return $SysTreeView
EndFunc
Func _createGeoJSON($epsg)
$json = '{ '& @CRLF & _
'"type": "FeatureCollection",' & @CRLF & _
'"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::'&$epsg&'" } },' & @CRLF & _
'"features": [' & @CRLF & _
'{ "type": "Feature", "properties": { "Id": 0 }, "geometry": { "type": "Polygon", "coordinates": [] } }' & @CRLF & _
']' & @CRLF & _
'}'
If NOT FileExists(@ScriptDir&"\temp") Then
DirCreate(@ScriptDir&"\temp")
Else
$file = _FileCreate(@ScriptDir&"\temp\temp.geojson")
FileOpen($file)
FileWrite($file, $json)
FileClose($file)
EndIf
EndFunc
Func _createPython($save_name)
Switch $save_name
Case "add_shp"
$add_shp = 'mxd = arcpy.mapping.MapDocument("CURRENT")'& @CRLF & _
'dataframe_string = mxd.activeView'& @CRLF & _
'dataframe = arcpy.mapping.ListDataFrames(mxd, dataframe_string)[0]'& @CRLF & _
'epsg = oldspatialref = dataframe.spatialReference'& @CRLF & _
'shp = arcpy.CreateFeatureclass_management(r'&"'"&'C:\Users\kursteilnehmer\Desktop\Neuer Ordner (2)\Shape'&"'"&', "'&$random&'.shp"'&', "POLYGON", spatial_reference=epsg)'
DirCreate(@TempDir&"\"&$program_name)
$file = _FileCreate (@TempDir&"\"&$program_name&"\add_shp.py")
FileOpen(@TempDir&"\"&$program_name&"\add_shp.py", 2)
FileWrite($file, $add_shp)
FileClose($file)
EndSwitch
EndFunc
Func _exec($exec, $handle)
_send_simple('execfile(r'&"'"&@TempDir&"\"&$program_name&"\"&$exec&"')", $handle)
EndFunc
Func _exit()
DirRemove(&@TempDir&"\"&$program_name, 1)
EndFunc
Func _freeze()
$img = @TempDir&"\"&$program_name&"\freeze.bmp"
WinActivate($hParentWindow)
$pos = WinGetPos($hParentWindow)
$border_top = _WinAPI_GetSystemMetrics($SM_CYCAPTION)
$border_side = _WinAPI_GetSystemMetrics($SM_CXFRAME)
$x1 = ($pos[0] + $border_side)
$y1 = ($pos[1] + $border_top + $border_side)
$x2 = ($pos[0] + $pos[2] - $border_side)
$y2 = ($pos[1] + $pos[3] - $border_side)
_ScreenCapture_SetBMPFormat(4)
_ScreenCapture_Capture($img, $x1, $y1, $x2, $y2, False)
GUICtrlSetState($Btnf7, $GUI_HIDE)
WinMove($winf7, "", 0, 0,($pos[2] - $border_side*2), ($pos[3] - $border_side*2 -$border_top))
$pic = GUICtrlCreatePic($img, 0, 0, ($pos[2] - $border_side*2), ($pos[3] - $border_side*2 -$border_top))
WinSetOnTop($winf7, "", 1)
Return $pic
EndFunc
Func _unfreeze($pic)
GUICtrlDelete($pic)
WinMove($winf7, "", $fleft, $ftop,30, 30)
GUICtrlSetState($Btnf7, $GUI_SHOW)
EndFunc
Alles anzeigen
Edit:
hier noch der Code der "Kill.exe"
Edit2:
ArcMap verwendet durchgehend eigene GUI-Objekte und nicht die von Windows gegebenen. Ich glaube also nicht das man das Contextmenü von ArcMap mit dem von Windows vergleichen kann, aber ich denke das, wenn man das Contextmenü von Windows verstecken könnte, dann könnte man mit der gleichen Methode auch das von ArcMap verstecken.
Also ein einfaches Beispielscript wäre, ein GUI zu erstellen, welches Always on Top ist und dann einen Rechtsklick irgendwo hinter dem Fenster zu machen. Das Ergebnis ist, dass das Contextmenü über dem Always on Top Gui gezeigt wird ... ![]()