Delphi-PRAXiS
Seite 5 von 10   « Erste     345 67     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Das Handle ist ungültig (https://www.delphipraxis.net/196216-das-handle-ist-ungueltig.html)

EWeiss 3. Mai 2018 13:07

AW: Das Handle ist ungültig
 
Zitat:

Warum eigentlich der Vergleich von PID mit der ProcID, die du über die gefüllte ProcList holst? Wozu dient das?
Warum? Weil ich die Lautstärke vom gesamten System und die der Anwendungs Lautstärke aus den Session ausschließen möchte.
Die werden immer erstellt unabhängig von einer Aktiven oder Inaktiven Session.

Ich habe jetzt die Icons und das mit dem aufsuchen der Anwendungen selbst funktioniert mit der Lösung von Zacherl gut.

Zitat:

ProcessName wird über OpenProcess() und GetModuleFileNameEx() geholt.
Wie gesagt hatte da immer ein ungültiges Handle aber nicht mit Zacherl's Funktion.

Ka hast du W10?

Die Icons sind im Moment nur Zentriert die höhe der Controls ist noch nicht angepasst.
Das mit den doppelten Sidebar Session ist auch noch nicht behoben. (Muss nachdenken wie ich das am besten mache ohne viele Aufwand)

EDIT:
Zudem wenn ich diese nicht vergleichen würde müsste ich die komplette liste mit
Delphi-Quellcode:
State <> uint(TAudioSessionState.AudioSessionStateExpired)

vergleichen und das kann dauern je nachdem wie viele Prozesse am laufen sind.

So vergleiche ich den Aktiven Prozess vorher mit der PID die über
Delphi-Quellcode:
SessionControl2.GetProcessID(PID);

ermittelt wurde.

Somit muss ich NUR maximal 9 abfragen und nicht 100 und mehr.

gruss

EWeiss 3. Mai 2018 13:09

AW: Das Handle ist ungültig
 
Zitat:

Zitat von TiGü (Beitrag 1401203)
Du solltest deiner
Delphi-Quellcode:
TAudioVolume.GetPathFromPID
Methode in der ersten Zeile übrigens ein
Delphi-Quellcode:
Result := '';
gönnen. Sicher ist sicher!

Wie gesagt ich schicke dir das Projekt gerne zu dann kannst sehen was abgeht. (PN mit Mail sollte reichen)
Da ist noch einiges im argen. ;)

Habe ich geändert die wird nicht mehr verwendet.

gruss

EWeiss 4. Mai 2018 02:49

AW: Das Handle ist ungültig
 
Zitat:

Warum eigentlich der Vergleich von PID mit der ProcID, die du über die gefüllte ProcList holst? Wozu dient das?
Die PID, die du mit SessionControl2.GetProcessID(PID); ermittelst, gibt dir doch eine gültige Process ID einer Audiosession?
Hier das Pic was ich bekomme wenn ich nicht die PID mit der ProcID vergleiche.
Ist schon seltsam das ganze ;)

Frage mich was machen die Folder in der Liste.
Zitat:

Active Session = 1
DisplayName =
StateSession = AudioSessionStateInactive

IconPath =

SessionIdentifier = {0.0.0.00000000}.{e457a6b5-b413-4304-9b72-f8ba7de1d36a}|\Device\HarddiskVolume1\Program Files (x86)\TAudioVolume\Demo_Eng\AudioVolumeAdj_Eng.exe %b{00000000-0000-0000-0000-000000000000}

ProcessID = 876
IsSystemSoundsSession = 1

SessionGuid = {3502FB3B-A396-417B-AC93-9D135913288D}
Den Prozess AudioVolumeAdj_Eng.exe hatte ich eigentlich ausgeschlossen.
Delphi-Quellcode:
if PID <> GetCurrentProcessId) then
Da ist noch einiges im Argen. LOL
Was real ist und was nicht.. der vergleich.
Und nach jedem Neustart sieht das anders aus.

Den SystemSound bekomme ich nicht.
Die sidebar ist doppelt und dreifach.. und AudioVolumeAdj_Eng wird als Folder angezeigt.

gruss

TiGü 4. Mai 2018 08:05

AW: Das Handle ist ungültig
 
Zitat:

Zitat von EWeiss (Beitrag 1401245)
Da ist noch einiges im Argen. LOL
Was real ist und was nicht.. der vergleich.
Und nach jedem Neustart sieht das anders aus.

Den SystemSound bekomme ich nicht.
Die sidebar ist doppelt und dreifach.. und AudioVolumeAdj_Eng wird als Folder angezeigt.

Laut Screenshots deines Programms sind es acht Sessions. Laut Windows vier Anwendungen und ein Gerät/Systemsound.
Ist der Wert von FSessionCount ermittelt durch:
Delphi-Quellcode:
HR := pEnumerator.GetCount(FSessionCount);
, denn auch acht? => Debuggen!

EWeiss 4. Mai 2018 08:30

AW: Das Handle ist ungültig
 
Bei 7 sichtbaren Controls + das der Anwendung sind es 8..
Und GetCount gibt mir 8 zurück.

Beim nächsten start der Anwedung bekomme ich aber 4 sichtbare Controls + das der Anwendung sind es 5
Und GetCount gibt mir 5 zurück.

Beim erneuten start der Anwendung bekomme ich über GetCount 6 geliefert.

Also irgendwie macht das teil was es will.
Beim letzten mal bevor ich das hier poste gibt GetCount 9 zurück.

gruss

TiGü 4. Mai 2018 08:38

AW: Das Handle ist ungültig
 
Delphi-Quellcode:
inc(SCount, i);
fällt dir was auf? :roll:

EWeiss 4. Mai 2018 08:48

AW: Das Handle ist ungültig
 
Zitat:

Zitat von TiGü (Beitrag 1401257)
Delphi-Quellcode:
inc(SCount, i);
fällt dir was auf? :roll:

Das hatte ich gestern schon geändert ist mir auch Aufgefallen. Aber danke für den Hinweis.
Hatte es geändert auf inc(SCount)

Ich hatte es aber auch aus kommentiert da es im Moment nicht mehr gebraucht wurde wegen diesen Kommentar von dir.
Zitat:

Warum eigentlich der Vergleich von PID mit der ProcID, die du über die gefüllte ProcList holst? Wozu dient das?
Ohne den vergleich macht das teil was es will.

gruss

TiGü 4. Mai 2018 08:53

AW: Das Handle ist ungültig
 
Erzeugst du die visuellen Elemente aufgrund der Größe des Rückgabewertes von TAudioVolume.GetSessionCount oder aufgrund der Länge des Arrays FAudioSessionList?

Sind diese Zeilen noch aktuell oder inzwischen auch geändert/auskommentiert?

Delphi-Quellcode:
 
  HR := pEnumerator.GetCount(FSessionCount);
  Succeeded(HR) then
   SetLength(FAudioSessionList, FSessionCount + 1);

EWeiss 4. Mai 2018 09:04

AW: Das Handle ist ungültig
 
Zitat:

Zitat von TiGü (Beitrag 1401263)
Erzeugst du die visuellen Elemente aufgrund der Größe des Rückgabewertes von TAudioVolume.GetSessionCount oder aufgrund der Länge des Arrays FAudioSessionList?

Sind diese Zeilen noch aktuell oder inzwischen auch geändert/auskommentiert?

Delphi-Quellcode:
 
  HR := pEnumerator.GetCount(FSessionCount);
  Succeeded(HR) then
   SetLength(FAudioSessionList, FSessionCount + 1);

aufgrund von des Arrays FAudioSessionList TAudioVolume.GetSessionCount deshalb das SCount
Es wurden so viele Elemente erstellt wie Session <> AudioSessionStateExpired

Also meine Änderung die ich aktuell verwende damit du nicht raten musst.. sorry.
Habe es mal mit deinem Schnipsel versucht das gleiche Spiel.
Nur als Gegenprobe zu meiner Version.

Delphi-Quellcode:
function TAudioVolume.GetSessionCount: integer;
var
  DeviceEnumerator: IMMDeviceEnumerator;
  SessionManager: IAudioSessionManager;
  SessionManager2: IAudioSessionManager2;
  AudioDevice: IMMDevice;
  SessionEnumerator: IAudioSessionEnumerator;
  SessionControl: IAudioSessionControl;
  SessionCount: Integer;
  HR: HResult;
begin

  Result := 0;
  SessionCount := 0;

  HR := CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_ALL, IID_IMMDeviceEnumerator, DeviceEnumerator);
  if Succeeded(HR) then
  begin
    HR := DeviceEnumerator.GetDefaultAudioEndpoint(eRender, eMultimedia, AudioDevice);
    if Succeeded(HR) then
    begin
      HR := AudioDevice.Activate(IID_IAudioSessionManager, CLSCTX_INPROC_SERVER, nil, IUnknown(SessionManager));
      if Succeeded(HR) then
      begin
        if Supports(SessionManager, IID_IAudioSessionManager2, SessionManager2) then
        begin
          HR := SessionManager2.GetSessionEnumerator(SessionEnumerator);
          if Succeeded(HR) then
          begin
            HR := SessionEnumerator.GetCount(SessionCount);
            if Succeeded(HR) then
            begin
              Setlength(FAudioSessionList, SessionCount + 1);
              Result := SessionCount;
            end;
            SessionControl := nil;
          end;
          SessionEnumerator := nil;
        end;
        SessionManager2 := nil;
      end;
      SessionManager := nil;
    end;
    AudioDevice := nil;
  end;
  DeviceEnumerator := nil;
end;
Delphi-Quellcode:
function TAudioVolume.GetSessionPID(Index: Integer; AudioDevice: IMMDevice): DWORD;
var
  SessionControl2: IAudioSessionControl2;
  SessionControl: IAudioSessionControl;
  pEnumerator: IAudioSessionEnumerator;
  PID: DWORD;
  HR: HResult;
begin
  Result := 0;

  if Assigned(SessionManager2) then
  begin
    HR := AudioDevice.Activate(IID_IAudioSessionManager2, CLSCTX_ALL, nil, IUnknown(SessionManager2)
      );
    if Succeeded(HR) then
    begin
      HR := SessionManager2.GetSessionEnumerator(pEnumerator);
      if Succeeded(HR) then
      begin
        HR := pEnumerator.GetSession(Index, SessionControl);
        if Succeeded(HR) then
        begin
          HR := SessionControl.QueryInterface(IAudioSessionControl2, SessionControl2);
          if Succeeded(HR) then
          begin
            HR := SessionControl2.GetProcessID(PID);
            if Succeeded(HR) then
              Result := PID;
          end;
        end;
      end;
    end;
  end;
end;
Bei deiner Version gibt mir sessioncount 0 zurück weil ich das AudioDevice neu initialisiere.

Nach jeden Neustart der Anwendung addiert sich der Count über SessionEnumerator.GetCount(SessionCount); um 1!
Das verstehe wer will.
Die Anzahl der Session unter Windows im, Mixer bleiben aber gleich.

gruss

TiGü 4. Mai 2018 09:19

AW: Das Handle ist ungültig
 
Zitat:

Zitat von EWeiss (Beitrag 1401264)
Nach jeden Neustart der Anwendung addiert sich der Count über SessionEnumerator.GetCount(SessionCount); um 1!
Das verstehe wer will.
Die Anzahl der Session unter Windows im, Mixer bleiben aber gleich.

Task Manager parallel öffnen und schauen, ob das Programm richtig beendet wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:00 Uhr.
Seite 5 von 10   « Erste     345 67     Letzte »    

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