2011-01-13 14 views
5

Desidero inviare un tratto chiave a un programma anche se è in esecuzione in background. Ma posso farlo solo per il blocco note come questo,Invia sequenze di tasti a un programma anche se è in background utilizzando C#

[DllImport("user32.dll")] 
protected static extern byte VkKeyScan(char ch); 

[DllImport("user32.dll", SetLastError = true)] 
protected static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); 

[DllImport("User32.Dll", EntryPoint = "PostMessageA")] 
protected static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam); 

char Key = // key value to send 

IntPtr hWnd = FindWindowEx(_handle, IntPtr.Zero, "edit", null); // _handle is the windows handle of the program (here its notepad) 
PostMessage(hWnd, WM_KEYDOWN, VkKeyScan(Key), 0); 

Ma per tutte le altre applicazioni non posso inviare sequenze di tasti se in background. Dal momento che non conosco il lpszClass di quel programma (penso che questo sia il nome userControl dell'area di digitazione in quel programma .Per NotePad è "edit". Ho trovato questo navigare in internet).

Per tutte le altre applicazioni ciò che sto facendo è mettere l'applicazione in primo piano, quindi inviare la chiave, quindi ottenere di nuovo il programma in primo piano. Ho bisogno che il mio programma sia sempre in primo piano.

[DllImport("USER32.DLL")] 
public static extern bool SetForegroundWindow(IntPtr hWnd); 

SetForegroundWindow(_handle);  // _handle is the windows handle of the program 

System.Threading.Thread.Sleep(50);  // Waiting few milliseconds till application coming to foreground.      
wsh.SendKeys(Key.ToString(), ref wait); // wsh is WshShellClass wsh= new WshShellClass(); 
SetForegroundWindow(_mainHandle); // _mainHandle is the windows handle of my application 

Ma in questo modo non sta funzionando. alcuni tasti vengono persi e il programma in primo piano-> sfondo> precedente-> sfondo ...... come il suo ballo ...

Come inviare le chiavi ad altre applicazioni se è in esecuzione in background. o c'è qualche modo/fonte per trovare il lpszClass di un programma?

Scusate se ho perso tutte le informazioni richieste. questa è una grande applicazione. Ho pubblicato solo le parti richieste qui. Se qualcuno ha bisogno di ulteriori informazioni, si prega di chiedere.

+1

Centinaia di domande su questo a SO già, non sono sicuro di come vi siete persi. Qualunque cosa tu faccia per focalizzare l'attenzione, non farlo. –

risposta

2

Potrebbe essere possibile calcolare il lpszClass del programma utilizzando uno strumento di ispezione come WinSpy++. Ti dà un mirino che puoi trascinare e posizionare sopra il controllo desiderato. Questo è stato in grado di fornirmi facilmente il nome della classe "modifica" per il blocco note.

Se le cose non funzionano, fare clic sul pulsante "Altro >>" in basso a destra di WinSpy ++, quindi fare clic sul pulsante "Trova" per visualizzare la gerarchia di controllo; potrebbe essere necessario inviare il messaggio WM_KEYDOWN a uno dei controlli padre o figlio.

3

Penso che sarà necessario avere il programma in background per installare un hook per tastiera di basso livello tramite la funzione win32 SetWindowsHookEx().

Ecco la documentazione MSDN per SetWindowsHookEx()

http://msdn.microsoft.com/en-us/library/ms644990(v=vs.85).aspx

Ed ecco l'articolo KB sul come farlo da C#

http://support.microsoft.com/kb/318804

Questo articolo va in qualche dettaglio, anche : http://www.codeguru.com/columns/vb/article.php/c4829

Prevedo che la tua app otterrà caug Tuttavia, da vari software spyware/antivirus come un registratore di tastiera.

Buona fortuna.

+0

Ciò richiederebbe la possibilità di modificare l'altro programma, giusto?In tal caso, sarebbe meglio fornire un'API pulita in primo luogo per fare tutto ciò di cui ha bisogno, invece di hack come inviare messaggi di key press o hook di basso livello. – Justin

Problemi correlati