Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Item aus einer SysListView32 lesen (Vista x64) (https://www.delphipraxis.net/129414-item-aus-einer-syslistview32-lesen-vista-x64.html)

hugo1990 18. Feb 2009 20:10


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:
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;
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.
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)

toms 19. Feb 2009 08:50

Re: Item aus der ListView des TaskManagers lesen (Vista x64)
 
Hallo

shima hat hierzu hier eine Antwort geschrieben.
Was ist eigentlich der Sinn dieses Auslesens? An die Laufenden Tasks kommt man auch einfach.

hugo1990 19. Feb 2009 14:55

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

Luckie 19. Feb 2009 15:01

Re: Item aus einer SysListView32 lesen (Vista x64)
 
Ich bin mir ziemlich sicher, dass es dafür API-Funktionen gibt.

hugo1990 19. Feb 2009 15:06

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.

hugo1990 19. Feb 2009 15:30

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.

himitsu 19. Feb 2009 15:35

Re: Item aus einer SysListView32 lesen (Vista x64)
 
Zitat:

dass man das in Vista rausgenommen hat, mit der Begründung, dass ein fremdes Programm nicht die Einstellungen des Benutzers verändern darf.
find ich aber auch ganz schön so :angel:

teebee 19. Feb 2009 15:54

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;

hugo1990 19. Feb 2009 17:13

Re: Item aus einer SysListView32 lesen (Vista x64)
 
Zitat:

Zitat von teebee
Ü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;

Cool, danke. Das war es, also brauche ich doch keinen 64-bit Compilier.

xDestiny 1. Sep 2009 00:29

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 10:54 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz