![]() |
Item aus einer SysListView32 lesen (Vista x64)
Ich möchte gern aus TaskMangaer ListView (eigentlich aus einem anderem SysListView32, welches aber schwieriger zu umschreiben wäre) ein Item auslesen, dazu habe ich mir folgenden Code aus mehreren Codeschnipseln zusammengebastelt.
Delphi-Quellcode:
dazu benötigt man noch die uProcessMemMgr.pas, die ich hier irgendwo im Forum gefunden habe. Auf meinem Laptop, auf dem Windows Vista Home Basic (32-bit) installiert ist, läuft das einwandfrei und ich bekomme den Text des Eintrags, aber auf meinem Rechner, auf dem Windows Vista Business (64-bit) installiert ist, bekomme ich nur einen leeren String zurück. Ich habe das Programm dann noch einen Kumpel geschickt, der auch ein 64-bit Vista installiert hat und er bekommt ebenfalls nur einen leeren String. Leider habe ich kein 2. 32-bit Vista um es dort noch testen zu können, aber ich vermute, dass es an dem 64-bit Vista liegt.
var
LVItem, lvi: TLVItem; PrItem, pvi: PLVItem; MemMgr: TProcessMemMgr; Buffer: PChar; begin MemMgr := CreateProcessMemMgrForWnd(aWnd); PrItem := MemMgr.AllocMem(SizeOf(TLVItem)); FillChar(LVItem, SizeOf(TLVItem), 0); LVItem.iItem := SendMessage(aWnd, LVM_GETNEXTITEM, -1, LVNI_SELECTED); LVItem.mask := LVIF_TEXT or LVIF_STATE; LVItem.iSubItem := 0; LVItem.pszText := Buffer; LVItem.cchTextMax := 255; MemMgr.Write(LVItem, PrItem, SizeOf(TLVItem)); ListView_GetItem(aWnd, PrItem^); MemMgr.Read(PrItem, LVItem, SizeOf(TLVItem)); Caption := MemMgr.ReadStr(LVItem.pszText); MemMgr.Free; end; Liege ich da mit meiner Annahme richtig? Weiß jemand, wie ich das Problem lösen kann? Grüße hugo1990 Edit: Überschrift geändert von: Item aus der ListView des TaskManagers lesen (Vista x64) zu: Item aus einer SysListView32 lesen (Vista x64) |
Re: Item aus der ListView des TaskManagers lesen (Vista x64)
Hallo
shima hat hierzu ![]() Was ist eigentlich der Sinn dieses Auslesens? An die Laufenden Tasks kommt man auch einfach. |
Re: Item aus der ListView des TaskManagers lesen (Vista x64)
Es geht mir ja nicht um die Tasks, ich habe ja oben geschrieben, dass ich den Taskmanager nur genommen habe, weil es besser zu umschreiben war und es ebenfalls ein SysListView32 ist. Aber bevor jetzt noch mehr solche Fragen kommen, schreibe ich mal, was ich genau vorhabe.
Also ich möchte ein Programm schreiben, welches mir das Standardwiedergabegerät unter Vista ändert. Da das aber nicht mehr so wie unter früheren Windowsversionen funktioniert, indem man ein paar Keys in der Registry ändert, muss ich einen Umweg über den Soundeinstellungsdialog gehen. Dort muss ich einfach nur das Wiedergabegerät, welches als Standard festgelgt werden soll auswählen und auf den Button "Als Standard" klicken. Das funktioniert ja auch schon in meinem Programm, nur bekomme ich halt unter Vista x64 die Namen der Geräte nicht. Die Geräte stehen zwar immer in der selben Reihenfolge da, aber davon will ich nicht grundsätzlich ausgehen, denn ich kann ja auch mal ein neues Gerät hinzufügen und es ändert sich dadurch etwas an der Reihenfolge. Und was in dem anderen Thread beschrieben wird kann es definitiv nicht sein, denn ich bekomme ja keine Fehlermeldung und das Sendmessage funktioniert ja auch um ein anderes Item in der ListView auszuwählen und auf den "Als Standard"-Button zu klicken. Mein Problem ist halt nur, dass ich unter Vista x64 nicht den Text des Items bekomme und das wäre mir schon wichtig. Grüße hugo1990 |
Re: Item aus einer SysListView32 lesen (Vista x64)
Ich bin mir ziemlich sicher, dass es dafür API-Funktionen gibt.
|
Re: Item aus einer SysListView32 lesen (Vista x64)
@Luckie
Wofür, um das Standardwiedergabegerät zu ändern oder für das Problem mit dem Item. Wenn du ersteres meinst, dann muss ich dich eines Besseren belehren, denn ich habe eine halbe Ewigkeit rumgegooglet um dafür eine API-Funktion zu finden und habe dann herausgefunden, dass man das in Vista rausgenommen hat, mit der Begründung, dass ein fremdes Programm nicht die Einstellungen des Benutzers verändern darf. |
Re: Item aus einer SysListView32 lesen (Vista x64)
Ah, ich habe gerade herausgefunden, dass es wirklich an den 64-bit liegt, die einzige Lösung, die es dafür gibt, ist das ganze mit einem 64-bit Compiler zu compilieren. Da es für Delphi meines Wissens nach soetwas aber noch nicht gibt, werde ich dann wohl das ganze mit einer anderen Sprache lösen müssen.
|
Re: Item aus einer SysListView32 lesen (Vista x64)
Zitat:
|
Re: Item aus einer SysListView32 lesen (Vista x64)
Überprüfe, wieviel-bittig Dein Betriebssystem ist (Stichwort IsWOW64Process) und benutze eine 64-Bit Struktur, falls nötig:
Delphi-Quellcode:
TLVItem64 = packed record
mask: UINT; iItem: Integer; iSubItem: Integer; state: UINT; stateMask: UINT; _align: LongInt; // Zeiger müssen in 64-Bit-Windows an 8-Byte-Alignment beginnen pszText: Int64; // Zeiger haben in 64-Bit-Windows 8 Byte cchTextMax: Integer; iImage: Integer; lParam: LPARAM; end; |
Re: Item aus einer SysListView32 lesen (Vista x64)
Zitat:
|
Re: Item aus einer SysListView32 lesen (Vista x64)
Hey hugo!
Ich stehe gerade vor dem selben Problem, das Standardwiedergabegerät zu ändern! Bisher hab ich allerdings nich besonders viel Erfolg gehabt. Wär nett, wenn du vllt ma posten könntest, wie du es geschafft hast! lg xdestiny |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz