Domanda

I Wanna inviare ictus chiave per un programma, anche se è in esecuzione in background. Ma posso farlo solo per il blocco note di questo tipo,

[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 riesco a inviare sequenze di tasti se in background. Dal momento che non conosco la lpszClass di quel programma (credo che questo sia il nome UserControl dell'area di digitazione in quel programma. Per NotePad è "edit". Ho trovato questo navigazione internet).

Per tutte le altre applicazioni Quello che sto facendo è, ottenere l'applicazione di primo piano, quindi inviare la chiave, poi di nuovo avere il mio programma in primo piano. Ho bisogno del mio programma da eseguire come primo piano sempre.

[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 sempre senza risposta e il programma di primo piano-> background-> foregound-> sfondo ...... come la sua danza ...

Come inviare le chiavi ad altre applicazioni se in esecuzione in background. O ci sono alcun modo / fonte per trovare la lpszClass di un programma?

Scusate se ho perso le informazioni qualsiasi richiesta. questo è un grande applicazione. Ho postato solo parti richieste qui. Se qualcuno ha bisogno di ulteriori informazioni, pls chiedere.

È stato utile?

Soluzione

Si può essere in grado di capire il lpszClass del programma utilizzando uno strumento di ispezione, come WinSpy ++ . Ti dà un mirino che è possibile trascinare e posizione sopra il controllo desiderato. Questo è stato in grado di fornire facilmente me con la "modifica" nome della classe per blocco note.

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

Altri suggerimenti

Credo che sarà necessario avere il programma in background installare un hook basso livello della tastiera 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

In questo articolo va in qualche dettaglio, anche: http: //www.codeguru .com / colonne / VB / Article.php / c4829

mi aspetto la vostra applicazione sarà coinvolto da vari software spyware / anti-virus come un logger di tastiera, però.

In bocca al lupo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top