Call di un conatto Messenger/Skype

lunedì 23 marzo 2009 - 14.05

tarabasch84 Profilo | Junior Member

Ciao ragazzi,
ho la necessità di inserire in un programma WPF che sto realizzando due pulsanti che diano la possibilità all'utente di avviare una chiamata messenger o skype a seconda del contatto selezionato. In che modo posso avviare messenger e skype e far partire quindi una chiamata/chat al contatto?


--
Credo che parte della colpa sia di billy...

aiedail92 Profilo | Expert

Ciao

Se le applicazioni sono installate basta che usi il metodo Process.Start, passando in base a quello che devi fare questi parametri:

//Avviare chat Skype: Process.Start("skype:nome_contatto"); //Avviare chiamata Skype: Process.Start("skype:nome_contatto?call"); //Avviare chat msn: Process.Start("msnim:chat?contact=nome_contatto"); //Avviare chiamata msn: Process.Start("msnim:voice?contact=nome_contatto"); //Avviare video chiamata msn: Process.Start("msnim:video?contact=nome_contatto");

Luca

tarabasch84 Profilo | Junior Member

Perfetto funziona!
Potrebbe dare problemi in Vista l'esecuzione di un process, magari blocchi e cose del genere?
--
Credo che parte della colpa sia di billy...

aiedail92 Profilo | Expert

Il codice l'ho provato su Vista, però ho l'UAC disabilitato e i permessi da amministratore.

Comunque non penso ci dovrebbero essere problemi, alla fine quello che viene eseguito è un comando shell, come se lo digitassi nella barra degli indirizzi di explorer...

Luca

tarabasch84 Profilo | Junior Member

Ciao,
ho notato solo in questo momento che con Messenger e con XP non funziona correttamente il comando >Process.Start("msnim:voice?contact=nome_contatto");
In pratica mi si apre IE che riporta nella barra degli indirizzi msnim:voice?contact=nome_contatto.
Come mai?
--
Credo che parte della colpa sia di billy...

aiedail92 Profilo | Expert

Ciao, scusa se rispondo solo ora

Comunque, assieme ad Internet Explorer ti dovrebbe aprire una finestra che chiede se vuoi davvero effettuare la chiamata; se clicki su Ok ti apre la finestra di IE e quella della chat di msn, se invece clicki su annulla, IE si apre lo stesso, ma non la chat.

Penso sia possibile saltare questo inconveniente con un metodo un po' poco ortodosso, cioè di inviare l'Ok alla finestra che si apre e quindi chiudere IE tutto da codice, se ti serve fammi sapere.

Luca

tarabasch84 Profilo | Junior Member

>Ciao, scusa se rispondo solo ora
Non ti preoccupare
>
>Comunque, assieme ad Internet Explorer ti dovrebbe aprire una
>finestra che chiede se vuoi davvero effettuare la chiamata; se
>clicki su Ok ti apre la finestra di IE e quella della chat di
>msn, se invece clicki su annulla, IE si apre lo stesso, ma non
>la chat.
E' esattamente quello che succede!
>
>Penso sia possibile saltare questo inconveniente con un metodo
>un po' poco ortodosso, cioè di inviare l'Ok alla finestra che
>si apre e quindi chiudere IE tutto da codice, se ti serve fammi
>sapere.
Quale sarebbe questo modo poco ortodosso??
>
>Luca
Ciao!

--
Credo che parte della colpa sia di billy...

aiedail92 Profilo | Expert

Il metodo sarebbe proprio quello che ti ho descritto. Ecco come potrebbe essere implementato:

delegate bool EnumWindowsProc(IntPtr hwnd, IntPtr lParam); [DllImport("user32.dll")] static extern bool EnumWindows(EnumWindowsProc lpfn, IntPtr lParam); [DllImport("user32.dll")] static extern bool EnumChildWindows(IntPtr hWndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam); [DllImport("user32.dll")] static extern int GetWindowThreadProcessId(IntPtr hwnd, out int lpdwProcessId); [DllImport("user32.dll")] static extern int GetWindowText(IntPtr hwnd, StringBuilder lpString, int nMaxCount); [DllImport("user32.dll")] static extern int SendMessage(IntPtr hwnd, uint Msg, IntPtr wParam, IntPtr lParam); const uint WM_GETTEXT = 0x000D; const uint WM_COMMAND = 0x0111; const int IDOK = 1; private void ApriChat(string contact) { Thread thd = new Thread(delegate() { Process.Start("msnim:chat?contact=" + contact); }); thd.Start(); Thread.Sleep(1000); //Ottiene l'elenco dei processi iexplore Process[] iexpl = Process.GetProcessesByName("iexplore"); int idProc = 0; //Cerca la finestra che chiede se avviare la conversazione EnumWindows(delegate(IntPtr hwnd, IntPtr lParam) { //Verifica che la finestra appartenga al processo iexplore. //Se non è così, passa alla successiva int id; GetWindowThreadProcessId(hwnd, out id); if (Array.FindIndex(iexpl, delegate(Process p) { return p.Id == id; }) == -1) return true; //Cerca fra le finestre figlio della finestra cercando il testo //per verificare se è effettivamente la finestra di richiesta Ok IntPtr ok = IntPtr.Zero; IntPtr msg = IntPtr.Zero; IntPtr szStr = Marshal.AllocHGlobal(1000); EnumChildWindows(hwnd, delegate(IntPtr child, IntPtr lpUnused) { SendMessage(child, WM_GETTEXT, new IntPtr(500), szStr); string text = Marshal.PtrToStringAnsi(szStr); if (text.Contains(contact)) msg = child; else if (string.Compare("ok", text, true) == 0) ok = child; return ok == IntPtr.Zero || msg == IntPtr.Zero; }, IntPtr.Zero); Marshal.FreeHGlobal(szStr); //Se non ha trovato la finestra, passa alla successiva if (ok == IntPtr.Zero || msg == IntPtr.Zero) return true; //Se invece l'ha trovata, invia alla finestra l'ok SendMessage(hwnd, WM_COMMAND, (IntPtr)IDOK, ok); //Esce dalla ricerca delle finestre idProc = id; return false; }, IntPtr.Zero); //Chiude l'internet explorer in base all'id trovato if (idProc != 0) { Thread.Sleep(750); Process proc = Process.GetProcessById(idProc); proc.WaitForInputIdle(); proc.CloseMainWindow(); } }

Come ti ho detto, non è un metodo molto ortodosso, penso che ci sia modo di fare il lavoro usando le API di msn, però devo ancora informarmi sull'argomento.

Luca

tarabasch84 Profilo | Junior Member

Ciao,
non appena ho un po' di tempo mi studierò il tuo codice.
Grazie mille.
Ciao.

ps: Per quanto riguarda le Api di Msn dovrebbe esserci in giro qualcosa del tipo "DotMsn" ma io non ho trovato nulla che possa essermi d'aiuto.




--
Credo che parte della colpa sia di billy...
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5