Trädvy Permalänk
Medlem
Registrerad
Jan 2006

Läsa av spotify - C#

Hej!
Med denna koden hämtar jag spotifys "MainWindowTitle" (Spotify - artist - låt) för att få namnet på låten som spelas.

Process[] procs = Process.GetProcesses(); foreach (Process p in procs) { if (p.ProcessName.Contains("spotify")) { string q = (p.MainWindowTitle); ; }

Detta funkar när spotify ligger i task baren, men när jag stänger ner spotify till system trayen funkar det inte.

Hur ska jag läsa av spotify när det ligger i system trayen?

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2004

Debugga genom att sätta en breakpoint på måsvingen alldeles efter:
if (p.ProcessName.Contains("spotify"))
{ // breakpoint här

Får du någon träff när du debuggar då? Om du inte kommer till breakpointen, finns det ingen process med det namnet. Om du kommer dit, är det MainWindowTitle som inte finns när processen inte har något fönster i taskbar.

Berätta vilket det var av de två, så kan vi hjälpa dig vidare sen.

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Citat:

Ursprungligen inskrivet av azoapes
Om du kommer dit, är det MainWindowTitle som inte finns när processen inte har något fönster i taskbar.

Så är det.

Trädvy Permalänk
Medlem
Registrerad
Jan 2006

Finns det ngn motsvarighet för MainWindowTitle till system trayen?

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2004

I brist på en bättre lösning kan du använda user32.dll direkt, utan att gå genom ramverket: http://pinvoke.net/default.aspx/user32.GetWindowText

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004

Man kan också observera att huvudfönstret är av typen "SpotifyMainWindow". Testa följande:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr FindWindow(string strClassName, int nptWindowName);

samt

IntPtr f = FindWindow("SpotifyMainWindow", 0); StringBuilder sb = new StringBuilder(100); int i = GetWindowText(f, sb, 100); string q = sb.ToString();

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2004
Citat:

Ursprungligen inskrivet av Elgot
Man kan också observera att huvudfönstret är av typen "SpotifyMainWindow". Testa följande:

Är inte det onödigt att använda FindWindow när han ändå redan har p.Handle som han kan använda?

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); public string GetWinText(IntPtr hWnd) { int length = GetWindowTextLength(hWnd); StringBuilder sb = new StringBuilder(length + 1); GetWindowText(hWnd, sb, sb.Capacity); return sb.ToString(); }

if (p.ProcessName.Contains("spotify")) { string q = GetWinText(p.Handle); }

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Citat:

Ursprungligen inskrivet av azoapes
Är inte det onödigt att använda FindWindow när han ändå redan har p.Handle som han kan använda?

Det skulle man kunna tycka, men det fungerar dåligt. Man får felet "Handle = 'p.Handle' threw an exception of type 'System.ComponentModel.Win32Exception'", "Access is denied".

Spotify-processen har för övrigt en hel drös fönster med olika titlar; om man lyckas lista dem är den den av typen SpotifyMainWindow man skall titta på.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2004
Citat:

Ursprungligen inskrivet av Elgot
Det skulle man kunna tycka, men det fungerar dåligt...

Spotify-processen har för övrigt en hel drös fönster med olika titlar; om man lyckas lista dem är den den av typen SpotifyMainWindow man skall titta på.

Tänk att praktiken alltid ska jävlas med teorin

Ja det är sant, det är en mer hållbar lösning. Det kan ju finnas en process från ett program "Spotify Recorder" eller liknande (bara ett exempel, moderatorer, lås inte tack).

Trädvy Permalänk
Medlem
Registrerad
Jan 2006
Citat:

Ursprungligen inskrivet av Elgot
Man kan också observera att huvudfönstret är av typen "SpotifyMainWindow". Testa följande:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr FindWindow(string strClassName, int nptWindowName);

samt

IntPtr f = FindWindow("SpotifyMainWindow", 0); StringBuilder sb = new StringBuilder(100); int i = GetWindowText(f, sb, 100); string q = sb.ToString();

Funkade jätte bra!
Tack för all hjälp.