Thema: Delphi Das Handle ist ungültig

Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#32

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 11:27
Zitat:
Laufen die Programme vielleicht als Administrator ("Als Administrator ausführen")? Dann kann OpenProcess so nicht funktionieren.
IExplorer und SideBar? denke schon.

Zitat:
Woher kommt die Variable PID? Oder um die Frage vielleicht klarer zu stellen: Wie ermittelst du den Wert von PID?
Delphi-Quellcode:
            HR := SessionControl2.GetProcessID(PID);
            if Succeeded(HR) then
            begin
              FAudioSessionList[Index].ProcessID := intToStr(PID);
              HR := SessionControl2.GetState(State);
              if Succeeded(HR) then
              begin
                if PID = ProcId then
                begin
                  if State <> uint(TAudioSessionState.AudioSessionStateExpired) then
                  begin
Zitat:
Ansonsten machst du was falsch.
möglich
Sonst würde ja alles funktionieren.

Anwendung..
Delphi-Quellcode:
    AudioVolume[i].GetSessionCount(AudioVolume1.Device);
    if AudioVolume1.AudioSessionInfo(i).PID <> 0 then
Delphi-Quellcode:
function TAudioVolume.GetSessionCount(AudioDevice: IMMDevice): integer;
var
  SessionControl2: IAudioSessionControl2;
  SessionControl: IAudioSessionControl;
  pEnumerator: IAudioSessionEnumerator;
  SCount: Integer;
  PID, ProcId: DWORD;
  State: uint;
  HR: HResult;
  i, j: integer;
  ProcList: TStringList;
begin

  ProcList := TStringList.Create;
  SCount := 0;

  GetProzessList(ProcList);
  if Assigned(SessionManager2) then
  begin
    HR := AudioDevice.Activate(IID_IAudioSessionManager2, CLSCTX_ALL, nil, IUnknown(SessionManager2)
      );
    if Succeeded(HR) then
    begin
      // get SessionQuery
      HR := SessionManager2.GetSessionEnumerator(pEnumerator);
      if Succeeded(HR) then
      begin
        HR := pEnumerator.GetCount(FSessionCount);
        if Succeeded(HR) then
          Setlength(FAudioSessionList, FSessionCount + 1);
        if Succeeded(HR) then
        begin
          for i := 0 to FSessionCount - 1 do
          begin
            HR := pEnumerator.GetSession(i, SessionControl);
            if Succeeded(HR) then
            begin
              HR := SessionControl.QueryInterface(IAudioSessionControl2, SessionControl2);
              if Succeeded(HR) then
              begin
                HR := SessionControl2.GetProcessID(PID);
                if Succeeded(HR) then
                begin
                  HR := SessionControl2.GetState(State);
                  if Succeeded(HR) then
                  begin
                    for j := 0 to ProcList.Count - 1 do
                    begin
                      ProcId := GetProcessIdFromModuleName(pWideChar(ProcList[j]));
                      if (PID = ProcId) and (PID <> GetCurrentProcessId) then
                      begin
                        if State <> uint(TAudioSessionState.AudioSessionStateExpired) then
                        begin
                          FAudioSessionList[i].ActiveSession := IntToStr(i);
                          FAudioSessionList[i].PID := PID;
                          inc(SCount, i);
                        end;
                      end;
                    end;
                  end;
                end;
              end;
              SessionControl2 := nil;
            end;
            SessionControl := nil;
          end;
        end;
      end;
      pEnumerator := nil;
    end;
  end;
  ProcList.free;
  Result := SCount;
end;
Ok hier GetSessionCount muss ich noch was tun es dauert einfach zu lange für jedes control diese Funktion zu durchlaufen.

gruss

Geändert von EWeiss ( 3. Mai 2018 um 12:07 Uhr)
  Mit Zitat antworten Zitat