2009-12-09 5 views
3

Je souhaite récupérer du texte d'une zone de texte dans mon autre application. ProcessName de la deuxième application est 'TestTextBox', le nom de TextBox est 'textBox1'.Obtenir du texte d'une autre application

Mon code, qui renvoie une chaîne vide:

[DllImport("user32.dll")] 
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, long wParam, [MarshalAs(UnmanagedType.LPStr)] StringBuilder lParam); 

Process[] processes = Process.GetProcessesByName("TestTextBox"); 
foreach (Process p in processes) 
{ 
    IntPtr pFoundWindow = p.MainWindowHandle; 
    const int WM_GETTEXT = 0x0D; 
    StringBuilder sb = new StringBuilder(); 
    IntPtr retVal = SendMessage(pFoundWindow, WM_GETTEXT, 100, sb); 
    MessageBox.Show(sb.ToString()); 
} 
+0

LINQ est toujours sur ma liste de tâches ... Aussi, si je comprends bien, LINQ fonctionne uniquement sous .NET 3.5 ou supérieur. Mais ce code devrait fonctionner sur tous les types de Windows, y compris ceux qui ont .NET 2.0 – sventevit

+0

Comment voulez-vous l'optimiser en utilisant LINQ? – Grzenio

+0

'Process.GetProcesses(). Tout (p => p.ProcessName.Contains (processName));' ou quelque chose du genre. Et ah, je ne savais pas que vous utilisiez .NET 2! –

Répondre

1

Vous obtenez le WindowHandle du principal formulaire dans le code affiché, selon MSDN un message GETTEXT à un formulaire doit retourner son titre. Si vous souhaitez obtenir du texte à partir d'un TextBox, vous devez passer le WindowHandle du TextBox comme premier argument.

+0

Comment puis-je obtenir WindowsHandle de la TextBox? – sventevit

+1

Le commentaire de Doc Brown devrait pouvoir vous aider, vous devrez probablement énumérer les fenêtres enfants et trouver un moyen d'identifier le TextBox dont vous voulez obtenir le texte. –

3

Qu'est ce qu'une "autre application"? Est-ce quelque chose que vous écrivez? Pourrait-il fonctionner sur une autre machine? Dans un autre domaine? Sous un autre compte d'utilisateur? L'application, le formulaire ou la zone de texte cible peuvent-ils changer? Avez-vous besoin d'une communication asynchrone (c'est-à-dire non bloquante) entre les applications?

Si la réponse à l'une de ces questions est «oui», vous devriez envisager d'utiliser .Net Remoting. Ceci est disponible à partir de .Net 2.0.

+0

Je n'ai même pas encore vu cette application, il pourrait aussi être écrit en python ou autre. Merci d'avoir mentionné .Net Remoting, je ne le savais pas. – sventevit

0

Vous pouvez utiliser l'API Windows comme d'autres l'ont mentionné ou vous pouvez utiliser une bibliothèque comme AutoIt qui pourrait rendre la tâche un peu plus facile. Je ne sais pas quelles sont vos exigences.

+0

Avec le lien de Doc Brown, j'ai réussi à le faire fonctionner, merci quand même. AutoIt n'est pas tout à fait ce que je cherchais :) – sventevit

Questions connexes