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