Permalänk
Medlem

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?

Permalänk
Medlem

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.

Permalänk
Hedersmedlem
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.

Permalänk
Medlem

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

Permalänk
Medlem

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

Permalänk
Hedersmedlem

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();

Permalänk
Medlem
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); }

Permalänk
Hedersmedlem
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å.

Permalänk
Medlem
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).

Permalänk
Medlem
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.