Das Problem entsteht, weil du die Daten des Fensters, das bei Rechtsklick aufgeht, nicht mit dem Tool abfragen kannst (Tool gibt das Zielkreuz nur per Linksklick frei und erlaubt keine Klicks).
Du mußt also mal mit WinList dir auflisten lassen, was beim Anzeigen des Kontextmenüs für ein neues Fenster entsteht. Hast du erst das Handle kannst du auch die Menüpunkte selektieren und einzeln aktivieren.
Beiträge von BugFix
-
-
Daher verstehe ich Deine Anmerkung nicht, dass sich das entsprechende Programm starten soll.
Bis jetzt hast du ja nur ein Tray-Icon am Idlen, dass erst auf einen Klick von dir das gewünschte Programm bzw. eine weitere Funktion dieses Programms startet. In der Regel kannst du diesen Aufruf auch direkt per Kommandozeile ausführen. Zumindest mit Systemprogrammen ist das, soweit ich weiß, weitestgehend möglich. Bsp. (USB-)Hardware auswerfen: RunDll32.exe shell32.dll,Control_RunDLL hotplug.dll
Einfach mal bei anderen Programmen in der Doku gucken, ob nicht per Flag der gesuchte Menüpunkt im Kontextmenü direkt aufgerufen werden kann. -
Wenn ich nicht irre, ist ein "Picker"-Ctrl nur dazu geeignet, Werte auszuspucken, die es selbst bereitstellt in der gewählten Form (Tages-, Monatskalender etc.).
Du kannst ihn also m.M. nicht als Input mißbrauchen. -
Wie kann ich mit Autoit auf ein bestimmtes Icon im Systray unter Windows 8/64 klicken?
Zusätzliche Besonderheit – die Startleiste ist automatisch ausgeblendet.
Dann ist doch "klicken" ziemlicher Quatsch, denn du weißt ja was sich hinter dem Icon verbirgt. Also rufe das entsprechende Programm direkt auf.
Falls das (warum auch immer) nicht realisierbar ist, mußt du die TrayIcon der Toolbar (Window-Class "Shell_TrayWnd") auslesen und vermutlich per SendMessage ansprechen. Aber ich meine mich zu erinnern, dass es zu diesem Thema vor ca. 1-2 Monaten einen umfangreichen Thread gab. -
Windows-konforme Controls (nach denen schaut es aus) kannst du mit ControlCommand-Befehlen bearbeiten. Schau mal in die Hilfe.
Aber bevor du dich quälst
- prüfe mal ob das zu installierende Programm nicht mit einem Schalter für Silent Installation versehen ist. -
Dann die LanguageTransmitter.exe Datei in den Scite Ordner einfügen.
Davon rate ich ab. Bei einem Update wird der alte SciTE-Ordner kpl. gelöscht. User-Einträge sind alle ausgelagert nach: C:\Users\USER\AppData\Local\AutoIt v3\SciTE und bleiben erhalten
Einfach in SciTEUser.properties eine eigene Propertie für Tools anlegen, z.B. user.tools.path=C:\MeineTools und dort das Skript speichern und darauf verweisen. $(user.tools.path)\LanguageTransmitter.exe "$(CurrentSelection)" -
das ist doch eine allgemein gehaltene Frage.
Kann man die so nicht beantworten?
In Sachen RegExp - eher NEIN. Reguläre Ausdrücke beziehen sich immer auf ganz spezielle Einsätze (z.B. Selektieren von eMail-Adressen etc.). Es geht darum ein Muster zu erkennen, welches über den regulären Ausdruck definiert wird. Und eben deshalb benötigt man immer einen Anwendungsfall und kann keine "allgemeinen" Fragen lösen.

-
Das Problem ist das Ich die Nicht-Zitate auslesen verarbeiten wollte
und diese dann wiederum in diesem String verarbeitet einsetzen wollteUnd warum sagst du das nicht schon im Startpost?
Das ist doch ein völlig anderer Ansatz, du solltest dann mit einer Callbackfunktion die "Nichtzitate" bearbeiten und im String ersetzen.
Wie das geht, findest du in etlichen Beiträgen hier im Forum. -
-
Kannst aber auch mal mit icacls probieren. Mußt dann das Ergebnis noch durchsortieren. Vielleicht geht das schneller.
AutoIt
Alles anzeigen$aRights = _GetRights('C:\Code_AutoIt') _ArrayDisplay($aRights) Func _GetRights($sPathOrFile) Local $sCMD = "icacls " & $sPathOrFile Local $iPID = Run(@ComSpec & " /c " & $sCMD, "", @SW_HIDE, $STDOUT_CHILD) ProcessWaitClose($iPID) Local $sOutput = StdoutRead($iPID) Return StringSplit(StringTrimRight(StringStripCR($sOutput), StringLen(@CRLF)), @CRLF) EndFunc -
kann ich dir aus dem Kopf nicht sagen. Starte mal Scriptomatic und schau nach, welche Methoden dir die einzelnen Klassen bieten.
Edit:
Soweit ich das nachgelesen habe, existiert keine interne Möglichkeit um kurz und knackig die Zugriffsrechte von Usern für eine Verzeichnisstruktur abzufragen.
Also musst du auf externe Mittel zugreifen: AccessEnum von Sysinternals -
doch nur Rechner verwalten bzw. lokal angelegte user, oder?!
Ich arbeite nicht regelmäßig mit WMI. Du kannst Remoteabfragen tätigen ($strComputer = "." <-- bedeutet localhost, da kannst du anderen Rechner angeben).
Ich weiß nicht sicher, inwiefern Gruppenrichtlinien bestimmte Abfragen unterbinden, einfach testen.
-
Wozu Powershell? Wenn ich das richtig verstanden habe, kannst du alles erforderliche per WMI abfragen. Falls das Bsp. nicht alle Daten enthält kannst du das anpassen. Details zu WMI findest du bei MSDN.
AutoIt
Alles anzeigen$strComputer = "." $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2") $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_UserAccount", Default,48) For $objItem in $colItems ConsoleWrite("-----------------------------------" & @LF) ConsoleWrite("Win32_UserAccount instance" & @LF) ConsoleWrite("-----------------------------------" & @LF) ConsoleWrite("AccountType: " & $objItem.AccountType & @LF) ConsoleWrite("Caption: " & $objItem.Caption & @LF) ConsoleWrite("Description: " & $objItem.Description & @LF) ConsoleWrite("Disabled: " & $objItem.Disabled & @LF) ConsoleWrite("Domain: " & $objItem.Domain & @LF) ConsoleWrite("FullName: " & $objItem.FullName & @LF) ConsoleWrite("InstallDate: " & $objItem.InstallDate & @LF) ConsoleWrite("LocalAccount: " & $objItem.LocalAccount & @LF) ConsoleWrite("Lockout: " & $objItem.Lockout & @LF) ConsoleWrite("Name: " & $objItem.Name & @LF) ConsoleWrite("PasswordChangeable: " & $objItem.PasswordChangeable & @LF) ConsoleWrite("PasswordExpires: " & $objItem.PasswordExpires & @LF) ConsoleWrite("PasswordRequired: " & $objItem.PasswordRequired & @LF) ConsoleWrite("SID: " & $objItem.SID & @LF) ConsoleWrite("SIDType: " & $objItem.SIDType & @LF) ConsoleWrite("Status: " & $objItem.Status & @LF) NextEdit:
Ich habe mal Scriptomatic4AutoIt zum einfachen Generieren von WMI-Code angehängt. -
Einfach die 3 Hilfedateien in den Ordner "C:\Program Files (x86)\AutoIt3\" kopieren.
Dann in SciTE F1 drücken.
Dann sind dort alle Befehle aufgelistet.Mal zum besseren Verständnis:
Intern greift SciTe ausschließlich per F1 auf die AutoIt3Help.exe zu. Diese fungiert als Wrapper und greift auf die *.chm im selben Pfad zu.
Die Anweisung in SciTE lautet:
# Commands to for Help F1
command.help.$(au3)=$(SciteDefaultHome)\..\Autoit3Help.exe "$(CurrentWord)"
command.help.subsystem.$(au3)=2Um z.B. Hilfe Dateien der Form *.chm direkt nutzen zu können, ist ein anderes Subsystem erforderlich. Hier mal am Bsp. meiner Python Installation:
command.help.$(file.patterns.py)=$(CurrentWord)!C:\Python27\Doc\python274.chm
command.help.subsystem.$(file.patterns.py)=4Aber wie gesagt: Der AutoIt-Hilfe-Wrapper erledigt das für dich, nur falls du noch andere Sprachen in SciTE verwalten möchtest ist das von Relevanz.
-
Hier ein kurzes Bsp., wie man mit Dateihandle arbeitet:
-
PixelSearch ( left, top, right, bottom, color [, shade-variation = 0 [, step = 1 [, hwnd]]] )
Wie unschwer erkennbar, sind 5 Parameter zwingend. Wenn du nur 2 übergibst, geht das natürlich in die Hose. -
@Racer
DAS ist doch viel zu einfach.
Aber wenn schon kurz, dann will ich auch Einzeiler

-
Damit auch der Start-Button verschwindet, wenn die Taskleiste ausgeblendet wird, habe ich noch ein paar Zeilen hinzugefügt... ich verstehe nur nicht, wieso das Fenster des Start-Button erst nach einem MouseMove wieder sichbar wird.
Weil der Startbutton nicht die Position 0,0 besitzt.
Hier mal die Funktion, bei der es dann auch egal ist, wo die Taskbar angedockt ist:AutoIt
Alles anzeigenFunc _TrayVisible($_fVisible) ; True/False Local Const $SWP_SHOWWINDOW = 0x40 Local Const $SWP_HIDEWINDOW = 0x80 Local $hTray = _WinAPI_FindWindow("Shell_TrayWnd", "") ;~ Local $hStart = _WinAPI_FindWindow("ClassicShell.CStartButton", "") ; bei Benutzung Classic.Shell Local $hStart = _WinAPI_FindWindow("Button", "Start") Local $aTray = WinGetPos($hTray), $aStart = WinGetPos($hStart) Local $iFlag = $_fVisible ? $SWP_SHOWWINDOW : $SWP_HIDEWINDOW _WinAPI_SetWindowPos($hTray, 0, $aTray[0], $aTray[1], $aTray[2], $aTray[3], $iFlag) _WinAPI_SetWindowPos($hStart, 0, $aStart[0], $aStart[1], $aStart[2], $aStart[3], $iFlag) EndFuncEdit:
Oder vielleicht besser allgemeingültig mit Vorbelegung Standard-Windows-ButtonAutoIt
Alles anzeigen; Classic Shell: ;~ _TrayVisible(False, "ClassicShell.CStartButton", "") ;~ Sleep(2000) ;~ _TrayVisible(True, "ClassicShell.CStartButton", "") ; Standard: _TrayVisible(False) Sleep(2000) _TrayVisible(True) Func _TrayVisible($_fVisible, $_sDefButtonClass='Button', $_sDefButtonText='Start') ; True/False Local Const $SWP_SHOWWINDOW = 0x40 Local Const $SWP_HIDEWINDOW = 0x80 Local $hStart = _WinAPI_FindWindow($_sDefButtonClass, $_sDefButtonText) Local $aTray = WinGetPos($hTray), $aStart = WinGetPos($hStart) Local $iFlag = $_fVisible ? $SWP_SHOWWINDOW : $SWP_HIDEWINDOW _WinAPI_SetWindowPos($hTray, 0, $aTray[0], $aTray[1], $aTray[2], $aTray[3], $iFlag) _WinAPI_SetWindowPos($hStart, 0, $aStart[0], $aStart[1], $aStart[2], $aStart[3], $iFlag) EndFunc -
Der 7-zip Befehl passt soweit, dieser läuft manuell in der cmd sauber durch.
Läuft der Befehl denn auch, wenn du ihn mal allein von einem Skript mit RunWait startest? Evtl. auch mal mit opt_flag $RUN_CREATE_NEW_CONSOLE probieren.
Edit:
Vielleicht ist es auch günstiger nur einmal eine Konsole zu öffnen und dann alle Befehle in diese Konsole abzusetzten (StdinWrite StdoutRead) -
Hier mal ein Bsp. von mir zum Hooken von Messages. Ist kommentiert und sollte verständlich sein.
AutoIt
Alles anzeigen;-- TIME_STAMP 2014-07-30 17:37:42 #cs WM_ -Message Hook - Nachricht wird erst in einer eigenen Funktion ausgewertet - dann an das System zurückgegeben (auswertbar mit GUIRegisterMsg) - oder verworfen ("Return 0" nach Msg-Auswertung in _WinProc, s. Zeile 76) #ce #include <GuiImageList.au3> #include <GuiListView.au3> #include <ListViewConstants.au3> #include <StructureConstants.au3> #include <WinAPI.au3> #include <WindowsConstants.au3> ;~ Local Const $GWL_WNDPROC = -4 $hGui = GUICreate("Test", 400, 400) $hListView = _GUICtrlListView_Create($hGui, "Listview", 10, 10, 380, 380) _GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES)) ; Load images $hImage = _GUIImageList_Create() _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16)) _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16)) _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x0000FF, 16, 16)) _GUICtrlListView_SetImageList($hListView, $hImage, 1) ; Add columns _GUICtrlListView_InsertColumn($hListView, 0, "Column 1", 100) _GUICtrlListView_InsertColumn($hListView, 1, "Column 2", 100) _GUICtrlListView_InsertColumn($hListView, 2, "Column 3", 100) ; Add items _GUICtrlListView_AddItem($hListView, "Row 1: Col 1", 0) _GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 2", 1) _GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 3", 2) _GUICtrlListView_AddItem($hListView, "Row 2: Col 1", 1) _GUICtrlListView_AddSubItem($hListView, 1, "Row 2: Col 2", 1) _GUICtrlListView_AddItem($hListView, "Row 3: Col 1", 2) GUISetState() ; $hProc = DllCallbackRegister('_WinProc', 'ptr', 'hwnd;uint;wparam;lparam') ; == hier registriere ich die Funktion "_WinProc" als Callback, Returntype ist "ptr", Parametertypen $hHook = _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, DllCallbackGetPtr($hProc)) ; == hier wird dem Fenster die Adresse der Callback-Prozedur übergeben, diese ersetzt jetzt die Standard-Window-Prozedur GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY') While GUIGetMsg() <> -3 Sleep(10) WEnd _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, $hHook) ; == nach Programmende: originale WinProc wiederherstellen DllCallbackFree($hProc) Func _WinProc($hWnd, $iMsg, $iwParam, $ilParam) ; == die Prozedur soll ausschließlich WM_NOTIFY auswerten ; wenn nicht die gewünschte Msg kommt - Rückgabe an System ; == andere Messages werden gleich durchgereicht ans System zur Auswertung If $iMsg <> $WM_NOTIFY Then Return _WinAPI_CallWindowProc($hHook, $hWnd, $iMsg, $iwParam, $ilParam) Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo $hWndListView = $hListView If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView) $tNMHDR = DllStructCreate($tagNMHDR, $ilParam) $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom")) $iIDFrom = DllStructGetData($tNMHDR, "IDFrom") $iCode = DllStructGetData($tNMHDR, "Code") Switch $hWndFrom Case $hWndListView Switch $iCode Case $LVN_COLUMNCLICK ; A column was clicked ; == Ich möchte nicht, dass diese Msg verwertet werden kann und verwerfe sie $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam) ConsoleWrite('MyProc: $LVN_COLUMNCLICK -->Column: ' & DllStructGetData($tInfo, "SubItem") & @CRLF) Return 0 ; <== Nachricht wird jetzt verworfen und kann über GUIRegisterMsg nicht verwertet werden Case $NM_CLICK ; == Diese Msg lasse ich durch ans System $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam) ConsoleWrite("MyProc: $NM_CLICK " & "-->Index: " & DllStructGetData($tInfo, "Index") & _ " -->SubItem: " & DllStructGetData($tInfo, "SubItem") & @CRLF) EndSwitch EndSwitch ; jetzt wird die normale WinProc aufgerufen, die man mit GuiRegisterMsg auswerten kann Return _WinAPI_CallWindowProc($hHook, $hWnd, $iMsg, $iwParam, $ilParam) EndFunc ;==>_WinProc Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam) Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView $hWndListView = $hListView If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView) $tNMHDR = DllStructCreate($tagNMHDR, $ilParam) $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom")) $iIDFrom = DllStructGetData($tNMHDR, "IDFrom") $iCode = DllStructGetData($tNMHDR, "Code") Switch $hWndFrom Case $hWndListView Switch $iCode Case $LVN_COLUMNCLICK ; A column was clicked <== Diese Nachricht erreicht die Funktion nicht mehr Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam) ConsoleWrite('GUIRegisterMsg: $LVN_COLUMNCLICK -->Column: ' & DllStructGetData($tInfo, "SubItem") & @CRLF) Case $NM_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam) ConsoleWrite("GUIRegisterMsg: $NM_CLICK " & "-->Index: " & DllStructGetData($tInfo, "Index") & _ " -->SubItem: " & DllStructGetData($tInfo, "SubItem") & @CRLF) EndSwitch EndSwitch Return 0 EndFunc ;==>WM_NOTIFY