Velted wow, genau so sollte es sein. Danke!
Moombas Peter S. Taler Eine Multiauswahl will ich nicht - nur ein simples hoch und runter zusätzlich mit den Pfeiltasten.
Danke euch allen!
Velted wow, genau so sollte es sein. Danke!
Moombas Peter S. Taler Eine Multiauswahl will ich nicht - nur ein simples hoch und runter zusätzlich mit den Pfeiltasten.
Danke euch allen!
Hat jemand ein Idee, wie ich den Code erweitern kann, sodass die Selektion mit den Pfeiltasten nach oben / unten verschoben werden kann?
;coded by LarsJ
#include <Array.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
Opt("MustDeclareVars", 1)
Global $hGui, $hLV, $iLVx, $iLVy, $aHit[2] = [-1, -1] ; $aHit contains row & col of marked cell
Example()
Func Example()
$hGui = GUICreate("Mark Cell in Listview", 500, 540)
Local $idLV0 = GUICtrlCreateListView("Column 0|Column 1|Column 2", 25, 10, 250, 500)
For $i = 0 To 99
GUICtrlCreateListViewItem("Cell " & $i & ".0" & "|Cell " & $i & ".1" & "|Cell " & $i & ".2", $idLV0)
Next
$hLV = GUICtrlGetHandle($idLV0)
$iLVx = 25
$iLVy = 10
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState()
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
EndFunc ;==>Example
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
Local $tNMHDR, $hWndFrom, $iCode
$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hLV
Local $iSelectedItem = _GUICtrlListView_GetSelectionMark($hLV)
ConsoleWrite(_GUICtrlListView_GetSelectedIndices($hLV) & @CRLF)
Switch $iCode
; Handle arrow key presses for selection movement
Case $LVN_KEYDOWN
Local $tNMLVKEYDOWN = DllStructCreate($tagNMLVKEYDOWN, $lParam)
Local $iVKey = DllStructGetData($tNMLVKEYDOWN, "VKey")
;~ If $iSelectedItem > -1 Then
;~ Local $iNewIndex = -1
;~ If $iVKey = 38 Then ; Up arrow key
;~ $iNewIndex = $iSelectedItem - 1
;~ ElseIf $iVKey = 40 Then ; Down arrow key
;~ $iNewIndex = $iSelectedItem + 1
;~ EndIf
;~ ConsoleWrite($iNewIndex & @CRLF)
;~ If $iNewIndex > -1 And $iNewIndex < _GUICtrlListView_GetItemCount($hLV) Then
;~ _GUICtrlListView_SetItemSelected($hLV, $iNewIndex, True, False)
;~ _GUICtrlListView_RedrawItems($hLV, $iNewIndex, $iNewIndex)
;~ EndIf
;~ EndIf
Case $LVN_ITEMCHANGED
Local $tNMLISTVIEW, $iItem, $aInfo
$tNMLISTVIEW = DllStructCreate($tagNMLISTVIEW, $lParam)
$iItem = DllStructGetData($tNMLISTVIEW, "Item")
_GUICtrlListView_SetItemSelected($hLV, $iItem, False)
_GUICtrlListView_SetItemState($hLV, $iItem, 0, $LVIS_FOCUSED)
Local $aInfo = GUIGetCursorInfo($hGui)
If $aInfo[2] Then
$aInfo = _GUICtrlListView_SubItemHitTest($hLV, $aInfo[0] - $iLVx, $aInfo[1] - $iLVy)
If $aInfo[0] > -1 And $aInfo[1] > -1 And $aInfo[0] = $iItem Then
If $aHit[0] > -1 Then _GUICtrlListView_RedrawItems($hLV, $aHit[0], $aHit[0])
If $aHit[0] <> $aInfo[0] Or $aHit[1] <> $aInfo[1] Then
$aHit[0] = $aInfo[0] ; Row
$aHit[1] = $aInfo[1] ; Col
Else
$aHit[0] = -1 ; Row
$aHit[1] = -1 ; Col
EndIf
_GUICtrlListView_RedrawItems($hLV, $iItem, $iItem)
EndIf
EndIf
Case $NM_CUSTOMDRAW
Local $tNMLVCUSTOMDRAW = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)
Local $dwDrawStage = DllStructGetData($tNMLVCUSTOMDRAW, "dwDrawStage")
Switch $dwDrawStage ; Holds a value that specifies the drawing stage
Case $CDDS_PREPAINT ; Before the paint cycle begins
Return $CDRF_NOTIFYITEMDRAW ; Notify the parent window of any ITEM-related drawing operations
Case $CDDS_ITEMPREPAINT ; Before painting an item
Return $CDRF_NOTIFYSUBITEMDRAW ; Notify the parent window of any SUBITEM-related drawing operations
Case BitOR($CDDS_ITEMPREPAINT, $CDDS_SUBITEM) ; Before painting a subitem
Local $dwItemSpec = DllStructGetData($tNMLVCUSTOMDRAW, "dwItemSpec") ; Item index
Local $iSubItem = DllStructGetData($tNMLVCUSTOMDRAW, "iSubItem") ; Subitem index
Local $uItemState = DllStructGetData($tNMLVCUSTOMDRAW, "uItemState") ; Item state
If $dwItemSpec = $aHit[0] Then ; Marked row
Switch $iSubItem
Case 0 To 1 ; Marked column
DllStructSetData($tNMLVCUSTOMDRAW, "ClrText", 0xFFFFFF) ; Forecolor white
DllStructSetData($tNMLVCUSTOMDRAW, "clrTextBk", 0xCC6600) ; Backcolor dark blue, BGR
Case Else ; Other columns
DllStructSetData($tNMLVCUSTOMDRAW, "ClrText", 0x000000) ; Forecolor black
DllStructSetData($tNMLVCUSTOMDRAW, "ClrTextBk", 0xFFFFFF) ; Backcolor white
EndSwitch
Else ; Other rows
DllStructSetData($tNMLVCUSTOMDRAW, "ClrText", 0x000000)
DllStructSetData($tNMLVCUSTOMDRAW, "ClrTextBk", 0xFFFFFF)
EndIf
Return $CDRF_NEWFONT ; $CDRF_NEWFONT must be returned after changing font or colors
EndSwitch
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Alles anzeigen
Wichtig ist, dass nur die ersten zwei Zellen markiert bleiben.
Oder so:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIListView.au3>
#include <WinAPIvkeysConstants.au3>
#include <WinAPISys.au3>
Opt("GUIOnEventMode", 1)
Global $hGui = GUICreate("Test", 320, 240)
GUISetOnEvent($GUI_EVENT_CLOSE, "_GUI_EVENT_CLOSE")
Global $cLV_Test = GUICtrlCreateListView("Name", 5, 5, 310, 230, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS))
For $i = 1 To 9
_GUICtrlListView_AddItem($cLV_Test, "Item" & $i)
Next
GUISetState(@SW_SHOW)
While Sleep(10)
If BitAND(BitAND(_WinAPI_GetAsyncKeyState($VK_CONTROL), 0x8000), BitAND(_WinAPI_GetAsyncKeyState($VK_A), 0x8000)) And WinActive($hGui) Then
ConsoleWrite("Ctrl+A was pressed" & @CRLF)
While BitAND(BitAND(_WinAPI_GetAsyncKeyState($VK_CONTROL), 0x8000), BitAND(_WinAPI_GetAsyncKeyState($VK_A), 0x8000))
Sleep(10)
WEnd
EndIf
WEnd
Func _GUI_EVENT_CLOSE()
Exit
EndFunc
Alles anzeigen
Edit: ich weiß nicht warum, aber "Alt Gr + A" funktioniert auch, obwohl $VK_RMENU <> $VK_CONTROL.
Leider nicht. Ich melde mich, falls ich einen Lösung finde. Kann aber dauern...
Letzter Aufruf - morgen fängt das Tippspiel an!
Könnt ihr bitte nochmals testen, ob soweit alles passt? Das DPI Gepöns ist eine komplizierte Sache...
DANKE
Die nächste Runde ist hiermit eingeläutet.
Wer Lust und Laune hat mitzutippen, einfach https://www.kicktipp.de/autoit-bl kostenlos registrieren und lostippen. Die Teilnehmer des letzten Kicktipps, die bis zum Ende durchgehalten haben, sind wieder automatisch dabei.
Viel Spaß beim Tippen!
Dann wird mir einiges klar.
Danke für's Testen!
Hast du vielleicht den ExplorerPatcher installiert?
BugFix Kannst du bitte mal testen, ob es bei dir funzt? Bekommst du in der Console "Error getting icon pos in taskbar"? Falls nicht, wird es wohl nicht funktionieren, da ich diesen Teil im Code noch nicht geändert habe.
Danke
Na wie üblich per Hand:
Männerhandarbeit - verstehe.
Leider fehlt auf meinem Notebook "Taskleiste fixieren". Kann sein, dass die Firma das per Policy entfernt hat.
BugFix wie hast du die Taskbar verschieben können?
Ich habe es damit probiert, aber funzt nicht: https://www.tomshardware.com/how-to/windows…bar-move-to-top
$iTaskbarPos = 0
$sRegKeyStuck = "HKEY_CURRENT_USER64\Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects3"
$sRegKeyMMStuck = "HKEY_CURRENT_USER64\Software\Microsoft\Windows\CurrentVersion\Explorer\MMStuckRects3"
$bSettings = RegRead($sRegKeyStuck, "Settings")
$tMem = DllStructCreate("ubyte reg[" & BinaryLen($bSettings) & "]")
$tMem.reg = $bSettings
$tMem.reg(13) = $iTaskbarPos
ConsoleWrite("StuckRects3: " & RegWrite($sRegKeyStuck, "Settings", "REG_BINARY", $tMem.reg) & @CRLF)
For $i = 1 To 100
$sName = RegEnumVal($sRegKeyMMStuck, $i)
$bData = RegRead($sRegKeyMMStuck, $sName)
If @error Then ExitLoop
$tMem = DllStructCreate("ubyte reg[" & BinaryLen($bData) & "]")
$tMem.reg = $bData
$tMem.reg(13) = $iTaskbarPos
ConsoleWrite(RegWrite($sRegKeyMMStuck, $sName, "REG_BINARY", $tMem.reg) & @CRLF)
Next
ConsoleWrite("Changed " & $i - 1 & " keys" & @CRLF)
Alles anzeigen
Nach dem Neustart von Windows Explorer wird der Key in StuckRects3 wieder auf 03 gesetzt.
Mein BS: Windows11 22H2
Na toll, Win11 22H2 funzt der Registry Hack nicht. Hmm, wie kann ich jetzt testen?
Danke BugFix , aber funktioniert die Funktion auch bei mehreren Monitoren?
Ich will ein kleines Skript schreiben, um die Taskbar Position zu ändern. Für Muli-Monitor Umgebungen müssen einige Registry Einträge verändert werden.
Hi Bugfix,
du hast die Taskleiste auf der linken Seite? Hmm, kein Wunder, dass das Fenster nicht sichtbar ist, denn die Berechnung basiert auf den Standard, d.h. die Taskleiste ist unten.
Da muss ich noch was basteln.
Aber du solltest im Fenster jedes Icon anklicken können, so dass diese ausgeführt wird. Mit der rechten Maustaste kannst du die App auch als Admin starten. Per Mousehover sollte der Eintrag auch markiert sein, wo sich gerade die Maus befindet.
argumentum Danke für das Testen. Ich weiß nicht, warum das Fenster so winzig erstellt wird, obwohl mehrere Icons in die Liste hinzugefügt wurden. Auf meinem Notebook werden 29 Icons hinzugefügt und das Fenster ist so kalkuliert, sodass alle Icons zu sehen sind. Ich denke gerade über einen anderen Weg nach, wie ich anhand der Icons das Fenster (GUI) erstellen kann...
argumentum: danke für dein Feedback. Das Problem ist, dass IUI leider nur die "File description" benutzt, um das Icon in der Taskleiste zu finden. Wenn du eine ältere Version benutzt und die Exe Datei an die Taskleiste angepinnt hattest, dann wird leider die "File description" Information nicht aktualisiert, falls du mittlerweile ein Update installiert hast und _WinAPI_FindMyIconPosInTaskbar findet dann das Icon nicht.
Kannst du bitte das Update (siehe Post#1) testen?
Danke.
Die neue Version sollte jetzt funzen.
Kanashius kannst du bitte nochmals testen?
Kanashius ich denke, dass ich weiß, woran es liegt. Und zwar am DPI für den oberen Monitor, der nicht bei 100% liegt, aber dein primärer Monitor schon. Somit verschiebt sich der Y Wert der Position der GUI entsprechend. Ich muss jetzt einen Weg finden, wie man per Monitor den DPI Wert ermittelt. Ich meine, dass ich da mal was gebastelt hatte...
Hi, die X-Position funktioniert, bei der Y-Position funktionieren alle bis auf den oberen Bildschirm. Da erscheint das Fenster dann ~mittig auf dem unteren Bildschirm.
Ich vermute das hängt damit zusammen, dass die Position dort negativ wäre?
Wenn das Toolbaricon nicht gefunden wird funktioniert es aber noch nicht (vermute, dass hast du noch nicht angepasst; $iMonitorY+X werden garnicht verwendet). Hatte erst den Sourcecode ausgeführt und nicht die EXE, da ist er immer in den oberen Case gegangen, weil die Description natürlich nicht stimmt^^
Da ich nur 3 Bildschirme habe, habe ich alle möglichen Positionen getestet und alle hatten funktioniert, wie z.B. links - mitte - oben
Genau, wenn _WinAPI_FindMyIconPosInTaskbar keine Koordinaten zurück gibt, dann funktioniert das manuelle Positionieren über den Mauszeiger noch nicht.
Danke fürs Testen.
Kanashius ich habe die Tests mit meinen 3 Monitoren durchgeführt und es hat funktioniert. Kannst du bitte nochmals mit deinen Monitoren testen?