Noch mal Moin,
dass Run eine 'falsche' PID liefert entsteht dadurch, dass "Calc.exe" nur einen weiteren Prozess mit eigener PID startet und sich dann verabschieded. Die gelieferte PID ist dann wertlos.
Noch mal Moin,
dass Run eine 'falsche' PID liefert entsteht dadurch, dass "Calc.exe" nur einen weiteren Prozess mit eigener PID startet und sich dann verabschieded. Die gelieferte PID ist dann wertlos.
Moin,
der Rechner "Calc.exe" startet jetzt die App "CalculatorApp.exe". Das Hauptfenster der Apps gehört immer der "ApplicationFrameHost.exe". Das Fenster des Rechners verbirgt sich unter dem Control "ApplicationFrameInputSinkWindow1". Deshalb all die 'Unstimmigkeiten'.
Moin gmmg,
das Zeitproblem sollte sich auch mit
$pid = ProcessWait("CalculatorApp.exe", 1) ; länger als 1 Sekunde sollte das nicht brauchen, wenn doch, ist $pid = 0
lösen lassen.
Moin Lottich,
wenn ich Deine Anforderungen lese und das Skript von AspirinJunkie immer in ($mExplWin["selected"])[0] den von Dir gewünschten Pfad liefert, heißt das für mich, Du suchst den Pfad des von Dir in einem aktuell aktiven Explorerfenster auf der rechten Seite markierten /selektierten Eintrags.
Wenn das so ist, sollte die folgende Methode 'geradeaus' zum Ziel führen:
HotKeySet('^!g', "GetFolder")
HotKeySet('{Esc}', "Cancel")
; Halte das Skript am Laufen, bis der Benutzer es beendet
While 1
Sleep(100) ; Warte in einer Schleife
WEnd
Func Cancel()
Exit
EndFunc
Func GetFolder()
MsgBox(0, "Aktives Verzeichnis", GetSelectedItemFromActiveExplorer())
EndFunc
;=======================================================================================================================
; Aktives Shellfensterobjekt bestimmen und ggf. den Pfad des (ersten) selektierten Elements zurückgeben
; InternetExplorer->Document = ShellFolderView Objekt
;=======================================================================================================================
Func GetSelectedItemFromActiveExplorer()
Static $CLSID_ShellFolderView = "{62112AA1-EBE4-11CF-A5FB-0020AFE7292D}"
Local $oShFolderView = 0
Local $hAct = DllCall("user32.dll", "hwnd", "GetForegroundWindow")[0] ; _WinAPI_GetForegroundWindow()
If $hAct <> 0 Then
For $oShellWindow In ObjCreate("Shell.Application").Windows()
If $oShellWindow.hWnd = $hAct Then
$oShFolderView = $oShellWindow.Document
IF IsObj($oShFolderView) And (ObjName($oShFolderView, 6) = $CLSID_ShellFolderView) Then
If $oShFolderView.SelectedItems.Count > 0 Then
Return $oShFolderView.SelectedItems.Item(0).Path
EndIf
EndIf
EndIf
Next
EndIf
EndFunc ;==>GetSelectedItemFromActiveExplorer
Alles anzeigen
Friede, Freude, Eierkuchen! (... und was immer Ihr Euch sonst noch wünscht!)
Moin,
ist ja nett, wie der eindeutige Verstoß gegen die Forenregeln mit einem Lächeln kommentiert oder total ignoriert wird. Wäre es nicht ehrlicher, den von mir zitierten Passus komplett zu streichen?
Moin,
zu Deiner Frage nach den 'Bots' im Vorstellungsthread:
Folgende Inhalte sind absolut nicht erwünscht. Das Team behält es sich ausdrücklich vor, zur Durchsetzung der Regeln je nach Schweregrad Benutzer, Posts und Threads zu verwarnen, zu sperren oder zu löschen.
Programme, die einem Spieler bei jeglicher Art von Computerspiel (auch Einzelspieler) einen Vorteil verschaffen ("Bots") Tools, um Nachrichten unerwünscht oft zu versenden (Spamming-Tools) Programme, die anderen, auch Freunden, einen Schreck einjagen sollen oder sich sonst über andere Nutzer lustig machen ("Spaßviren") Automatisierung von Webseiten oder Tools, die das in ihren AGBs verbieten
Moin UPIA,
vielleicht gefällt Dir diese Version von Func WM_NOTIFY() besser:
; ----------------------------------------------------------------------------------------------------------------------
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
#forceref $iMsg, $wParam, $lParam
Local $tNMCD = DllStructCreate($tagNMCUSTOMDRAW, $lParam)
Local $idFrom = $tNMCD.IDFrom, $iCode = $tNMCD.Code
Local $aSettings = _GuiIconButtonsSettings($idFrom)
If IsArray($aSettings) And ($iCode = $NM_CUSTOMDRAW) Then
Local $hBN = $tNMCD.hWndFrom
Local $iDS = $tNMCD.dwDrawStage
Local $hDC = $tNMCD.hdc
Local $tRC = DllStructCreate($tagRECT, DllStructGetPtr($tNMCD, 6))
Local $iST = $tNMCD.uItemState
If Not $iST = $CDDS_PREPAINT Then Return $GUI_RUNDEFMSG
Local $iColor = 5
Select
Case BitAnd($iST, $CDIS_SELECTED)
$iColor = 7
Case BitAND($iST, $CDIS_HOT)
$iColor = 6
EndSelect
_WinAPI_DrawThemeParentBackground($hBN, $hDC)
Local $hBR = _WinAPI_CreateSolidBrush($aSettings[$iColor])
Local $hRgn = 0
If @OSVersion = "WIN_11" Then
$hRgn = _WinAPI_CreateRoundRectRgn(0, 0, $aSettings[0], $aSettings[1], 9, 9)
Else
$hRgn = _WinAPI_CreateRectRgn(0, 0, $aSettings[0], $aSettings[1])
EndIf
_WinAPI_FillRgn($hDC, $hRgn, $hBR)
_WinAPI_DeleteObject($hBR)
Local $hIcon = $aSettings[2]
Local $iW = $aSettings[3]
Local $iH = $aSettings[4]
Local $iX = Round(($aSettings[0] - $IW) / 2)
Local $iY = Round(($aSettings[1] - $IH) / 2)
_WinAPI_DrawIconEX($hDC, $iX, $iY, $hIcon, $iW, $iH)
If BitAND($iST, $CDIS_FOCUS) Or BitAnd($iST, $CDIS_HOT) Then
$hBR = _WinAPI_GetSysColorBrush($COLOR_HIGHLIGHT)
_WinAPI_FrameRgn($hDC, $hRgn, $hBR, 1, 1)
EndIf
_WinAPI_DeleteObject($hRgn)
Return $CDRF_SKIPDEFAULT
EndIf
Return $GUI_RUNDEFMSG
EndFunc
Alles anzeigen
Moin UPIA,
der 'echte' Button liefert bei NM_CUSTOMDRAW den 'Hover' Status automatisch.
"Das Zeichnen des Buttons könnte man noch verfeinern bzw. an Win 11 anpassen"
Die Styles bringen Dir hier nichts, weil der Button komplett selbst gezeichnet wird.
Moin,
hier kommt die Methode "Velted2". Die sollte das Leben deutlich einfacher machen:
#include <GUIConstants.au3>
#include <StaticConstants.au3>
#include <StructureConstants.au3>
#include <ButtonConstants.au3>
#Include <WindowsConstants.au3>
#include <WinAPIGdi.au3>
#include <WinAPIShellEx.au3>
Global Const $tagNMCUSTOMDRAW = "struct;" & $tagNMHDR & ";dword dwDrawStage;handle hdc;" & $tagRECT & _
";dword_ptr dwItemSpec;uint uItemState;lparam lItemlParam;endstruct"
Example()
Func Example()
Local $sIconFileName = "C:\Windows\System32\imageres.dll"
Global $hGUI = GUICreate("GuiTest", 300, 200)
; Create 'icon buttons'
Local $hIcon = _WinAPI_ShellExtractIcon($sIconFileName, 4, 48, 48)
Local $idBtn1 = _GUICtrlCreateIconButton(20, 20, 50, 50, $hIcon, 48, 48, 0xCCCCCC, 0x00CCCC, 0x00FFFF)
GUICtrlSetTip($idBtn1, "IconButton 1", "")
Local $hIcon = _WinAPI_ShellExtractIcon($sIconFileName, 16, 32, 32)
Local $idBtn2 = _GUICtrlCreateIconButton(20, 80, 50, 50, $hIcon, 32, 32, 0x0000CC, 0x00CC00, 0xFF0000)
GUICtrlSetTip($idBtn2, "IconButton 2", "")
Local $hIcon = _WinAPI_ShellExtractIcon($sIconFileName, 82, 16, 16)
Local $idBtn3 = _GUICtrlCreateIconButton(20, 140, 50, 50, $hIcon, 16, 16, 0x808080, 0xE0E0E0, 0x404040)
GUICtrlSetTip($idBtn3, "IconButton 3", "")
GUISetState(@SW_SHOW, $hGUI)
Local $iPID = 0
; Loop until the user exits.
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $idBtn1
; Run Notepad with the window maximized.
MsgBox(0, "Button 1", "You clicked me!")
EndSwitch
WEnd
; Delete the previous GUI and all controls.
GUIDelete($hGUI)
; Close the Notepad process using the PID returned by Run.
If $iPID Then ProcessClose($iPID)
EndFunc ;==>Example
; ----------------------------------------------------------------------------------------------------------------------
Func _GuiCtrlCreateIconButton($iX, $iY, $iW, $iH, $hIcon, $iIconW, $iIconH, $iColorN, $iColorH, $iColorP)
Static $bOnmessage = False
Local $idBtn = GUICtrlCreateButton("", $ix, $iY, $iw, $iH, $BS_ICON)
GUICtrlSendMsg(-1, $BM_SETIMAGE, 1, $hIcon)
Local $aSettings = [$iW, $iH, $hIcon, $iIconW, $iIconH, $iColorN, $iColorH, $iColorP]
_GuiIconButtonsSettings($idBtn, $aSettings)
If Not $bOnmessage Then
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
$bOnmessage = True
EndIf
Return $idBtn
EndFunc
; ----------------------------------------------------------------------------------------------------------------------
Func _GuiIconButtonsSettings($idBtn, $aSettings = Default)
Static $mBtns[]
Select
Case IsArray($aSettings) And UBound($aSettings) = 8
$mBtns[$idBtn] = $aSettings
Return True
Case MapExists($mBtns, $idBtn)
Return $mBtns[$idBtn]
EndSelect
Return False
EndFunc
; ----------------------------------------------------------------------------------------------------------------------
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
#forceref $iMsg, $wParam, $lParam
Local $tNMCD = DllStructCreate($tagNMCUSTOMDRAW, $lParam)
Local $idFrom = $tNMCD.IDFrom, $iCode = $tNMCD.Code
Local $aSettings = _GuiIconButtonsSettings($idFrom)
If IsArray($aSettings) And ($iCode = $NM_CUSTOMDRAW) Then
Local $iDS = $tNMCD.dwDrawStage
Local $hDC = $tNMCD.hdc
Local $tRC = DllStructCreate($tagRECT, DllStructGetPtr($tNMCD, 6))
Local $iST = $tNMCD.uItemState
Local $iColor = 5
Select
Case BitAnd($iST, $CDIS_SELECTED)
$iColor = 7
Case BitAND($iST, $CDIS_HOT)
$iColor = 6
EndSelect
Local $hBR = _WinAPI_CreateSolidBrush($aSettings[$iColor])
_WinAPI_FillRect( $hDC, $tRC, $hBR)
Local $hIcon = $aSettings[2]
Local $iW = $aSettings[3]
Local $iH = $aSettings[4]
Local $iX = Round(($aSettings[0] - $IW) / 2)
Local $iY = Round(($aSettings[1] - $IH) / 2)
_WinAPI_DrawIconEX($hDC, $iX, $iY, $hIcon, $iW, $iH)
_WinAPI_DeleteObject($hBR)
If BitAND($iST, $CDIS_FOCUS) Then
$hBR = _WinAPI_GetSysColorBrush($COLOR_HIGHLIGHT )
_WinAPI_FrameRect($hDC, $tRC, $hBR)
EndIf
Return $CDRF_SKIPDEFAULT
EndIf
Return $GUI_RUNDEFMSG
EndFunc
Alles anzeigen
Bei den Includes kann wahrscheinlich noch 'entschlackt' werden. Und das Zeichnen des Buttons könnte man noch verfeinern bzw. an Win 11 anpassen. Für den Start sollte es aber reichen.
Viel Spaß!
Edit 05.12.25 13:13: _WinAPI_DrawIconEX() korrigiert
Moin,
wenn Du ein Label als Buttonersatz nehmen willst, könnte das auch so funktionieren:
#include <GUIConstantsEx.au3>
#include <GUIConstants.au3>
#include <StaticConstants.au3>
#include <WinAPIShellEx.au3>
Global Const $SS_REALSIZEIMAGE = 0x0800 ; fehlt in StaticConstants.au3
Example()
Func Example()
Local $sIconFileName = "C:\Windows\System32\imageres.dll"
Local $iIconIndex = 4
Local $bg_color = 0x008000
Global $hGUI = GUICreate("GuiTest", 300, 200)
; Createing a color label with the icon as pseudo-button
Local $iBtnStyle = BitOR($SS_CENTERIMAGE, $SS_ICON, $SS_NOTIFY, $SS_REALSIZEIMAGE)
Local $idButton_3 = GUICtrlCreateLabel("", 170, 30, 48, 48, $iBtnStyle)
GUICtrlSetTip(-1, "nice ico", "")
GUICtrlSetBkColor(-1, $bg_color)
Local $hIcon = _WinAPI_ShellExtractIcon($sIconFileName, 4, 32, 32)
GUICtrlSendMsg(-1, $STM_SETICON, $hIcon, 0)
; Press this button to "solve" the problem
Local $idButton_Switch = GUICtrlCreateButton("See the bug!", 210, 170, 85, 25)
GUISetState(@SW_SHOW, $hGUI)
Local $iPID = 0
; Loop until the user exits.
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $idButton_Switch
If $bg_color = 0x008000 Then
$bg_color = 0x000080
GUICtrlSetBkColor($idButton_3, $bg_color)
$msg = "nice ico"
ElseIf $bg_color = 0x000080 Then
$bg_color = 0x008000
GUICtrlSetBkColor($idButton_3, $bg_color)
$msg = "Nice ico"
EndIf
Case $idButton_3
; Run Notepad with the window maximized.
MsgBox(0,"Label-Button", "Does what you want it to do!")
EndSwitch
WEnd
; Delete the previous GUI and all controls.
GUIDelete($hGUI)
; Close the Notepad process using the PID returned by Run.
If $iPID Then ProcessClose($iPID)
EndFunc ;==>Example
Alles anzeigen
Moin Reinhard,
hast Du mit der neuen Version der Funktion (Zeile 5) aus _GDIPlus_ImageCalcDif_3.3.18.0.zip getestet?
Func __I2D_BufferCalcDif($v1, $v2) ; Rocket Science
Local $iPX = $v1.WIDTH * $v1.HEIGHT
Local $vDIFF = DllStructCreate('int')
DllStructSetData($vDIFF, 1, $iPX)
DllCallAddress('int', $pOP_ImageCalcDif, 'ptr', $v1.PTR, 'ptr', $v2.PTR, 'ptr', DllStructGetPtr($vDIFF)) ; <<<<<<<<<<<<<<<
;~ _ASM_Call($iOP_ImageCalcDif, $v1.PTR, $v2.PTR, DllStructGetPtr($vDIFF))
Local $nDif = DllStructGetData($vDIFF, 1) / $iPX
Return ($nDif > 765 Or $nDif < 0) ? SetError(1) : $nDif
EndFunc
Und, wenn Du versuchst, mit 64-Bit AutoIt 32-BIT Maschinencode (Assembler) auszuführen, wäre es sehr sehr zufällig, wenn das nicht abstürzt.
Moin, sorry, ich war wohl noch schläfrig. Das war Unsinn!
Tja, da gibts wohl keine Funktionen mit "void" Returnwert mehr. Kamma nix machen.
Das müsste man noch mal intensiv testen. Fakt ist, dass Dein DllCall einen Floatingpoint-Wert zurückgeben soll, und das ist eben nicht "NONE".
Zitat
NONE no value (only valid for return type - equivalent to void in C)
ZitatWhen used as a function return type, the void keyword specifies that the function doesn't return a value.
Man könnte deshalb auch meinen, dass Du ursprünglich einen falschen Return-Typ gewählt hast. Wie die returnierten Daten entstehen, bleibt dennoch ein Rätsel.
Moin Zusammen,
das Ergebnis "0" erhält man nicht einmal, wenn man zwei Mal dieselbe PNG-Datei lädt.
Das Ergebnis "1" kommt aus SetError(1), bei mir bei der Prüfung ob die Abweichung größer als "765" ist.
Was da nicht stimmt, kann ich nicht sagen, weil ich den Assembler-Teil nicht prüfen kann.
Bei mir läuft AutoIt 3.3.18.0 (32 Bit) auf Win 11 (64-Bit).
Moin,
was hältst Du davon, der Funktion eine Parameter-Array zu übergeben? Damit hast Du immer Alles sicher im Griff.
Moin BugFix ,
wie kommst Du zu der Behauptung, ich sei ein 'Forist'? Ich verwahre mich gegen diese vollkommen realitätsferne Unterstellung. ![]()
Mach mal halblang, Velted
Ansonsten sollte vielleicht ein Moderator den letzten Teil dieses Beitrags unter dem Titel "Wer braucht wofür Datenbanken?" nach Talk verlagern.
Moin Peter S. Taler ,
es gibt Leute, die sich als Prügelknaben anbieten, weil ihnen das im Gegenzug die Möglichkeit bietet, lauthals über die Ungerechtigkeit der Mitmenschen und der Welt an sich zu lamentieren. Wenn ich mir Deine Argumente anschaue, entsteht bei mir der Eindruck, dass Du einer von diesen Leuten sein könntest.
... mir ist klar, für die folgenden Zeilen beziehe ich wieder mal Prügel...egal.
ist ein deutlicher Wink mit dem "Zaunpfahl", dass Du nicht an einer sachlichen Auseinandersetzung interessiert bist. Allen hier Beteiligten ist klar, dass eine Datenbank für die Lösung der bisher bekannten Aufgabenstellung nicht notwendig ist. Alina will aber genau diese Lösung ausprobieren. Weshalb also Deine Einwände?
Und: 10.000 Datensätze mit 10 Feldern sind für aktuelle Rechner normalerweise eine 'winzige' Datenmenge. Ich hätte angenommen, dass Du das weißt.
Moin Peter S. Taler,
die Anderen haben anscheinend keine Lust auf eine Prügelei, ich eigentlich auch nicht, aber ich bin heute mit richtig schlechter Laune aufgewacht und nehme Dein Angebot deshalb gern an.
Wenn Alina eine Datenbank benutzen will, so lass ihr doch ihren Willen. Du hast sicher Recht, wenn Du sagst, dass man einfach strukturierte Textdaten mit ein paar Hundert Sätzen mit jeweils ein paar Zig Feldern auf aktuellen Rechnern auch mit einer normalen Datei bearbeiten kann. Dein _FileReadToArray() versagt aber schon dann, wenn Du das Delimiterzeichen auch in Feldinhalten benötigst. Mehrzeilige Feldinhalte sind nur mit einigem Aufwand realisierbar und binäre Feldinhalte bleiben auch 'außen vor'.
Wenn die Dateien größer werden ist _FileReadToArray() auch nur bedingt das Mittel der Wahl. Intern werden dabei für den gesamten Inhalt der Datei zwei Arrays erstellt. Das kann dauern und unnütz viel Speicher kosten (Ich weiß, Speicher kostet nichts!).
Wenn Du für Deine Datenbank ein schlichtes 'lokales' DB-System wie SQLite verwendest, beschränkt sich der Aufwand auf das Einlesen in die UDF und die SQL-Syntax. Man kann das schaffen.
Solange Du mit Deinen Dateien glücklich bist, nutze sie. Was Alina macht, sollte aber ihr überlassen bleiben.
Grüße, Velted