Récupère le texte de la fenêtre active (et envoie plus de texte)

Je crée un petit programme en C#, qui va ajouter du texte à une zone de texte lorsque une touche d'accès rapide est pressé, c'est un type de l'auto complète de la fonction. J'ai ma touche d'accès rapide de travail, mais maintenant je ne sais pas comment pour obtenir le texte en cours dans la zone de texte active (si la fenêtre active est une zone de texte.) Ce que j'ai essayé jusqu'à présent est d'utiliser

un. GetForegroundWindow et puis en utilisant la poignée appel de GetWindowText. Cela m'a donné le titre de la fenêtre de la fenêtre active, et non pas le contenu de textbox.

b. GetActiveWindow et en utilisant la poignée pour appeler GetWindowText. Que me donne pas de texte du tout.

Voici un exemple de ce que j'ai fait

[DllImport("user32.dll")]
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
[ DllImport("user32.dll") ]
static extern int GetForegroundWindow();
[ DllImport("user32.dll") ]
static extern int GetWindowText(int hWnd, StringBuilder text, int count);   
[DllImport("user32.dll")]
static extern int GetActiveWindow();

public static void TestA() {
    int h = GetForegroundWindow();
    StringBuilder b = new StringBuilder();
    GetWindowText(h, b, 256);
    MessageBox.Show(b.ToString());
}

public static void TestB() {
    int h = GetActiveWindow();
    StringBuilder b = new StringBuilder();
    GetWindowText(h, b, 256);
    MessageBox.Show(b.ToString());
}

Donc, toutes les idées sur la façon de réaliser cet objectif?

Modifier 28.01.2009:
Donc, j'ai trouvé comment faire cela. C'est ce que j'ai utilisé:

using System;
using System.Text;
using System.Runtime.InteropServices;

public class Example
{
[DllImport("user32.dll")]
static extern int GetFocus();

[DllImport("user32.dll")]
static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach);

[DllImport("kernel32.dll")]
static extern uint GetCurrentThreadId();

[DllImport("user32.dll")]
static extern uint GetWindowThreadProcessId(int hWnd, int ProcessId);    

[DllImport("user32.dll") ]
static extern int GetForegroundWindow();

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern int SendMessage(int hWnd, int Msg, int wParam, StringBuilder lParam); 

const int WM_SETTEXT = 12;
const int WM_GETTEXT = 13;

public static void Main() 
{
    //Wait 5 seconds to give us a chance to give focus to some edit window,
    //notepad for example
    System.Threading.Thread.Sleep(5000);
    StringBuilder builder = new StringBuilder(500);

    int foregroundWindowHandle = GetForegroundWindow();
    uint remoteThreadId = GetWindowThreadProcessId(foregroundWindowHandle, 0);
    uint currentThreadId = GetCurrentThreadId();

    //AttachTrheadInput is needed so we can get the handle of a focused window in another app
    AttachThreadInput(remoteThreadId, currentThreadId, true);
    //Get the handle of a focused window
    int  focused = GetFocus();
    //Now detach since we got the focused handle
    AttachThreadInput(remoteThreadId, currentThreadId, false);

    //Get the text from the active window into the stringbuilder
    SendMessage(focused, WM_GETTEXT, builder.Capacity, builder);
    Console.WriteLine("Text in active window was " + builder);
    builder.Append(" Extra text");
    //Change the text in the active window
    SendMessage(focused, WM_SETTEXT, 0, builder);
    Console.ReadKey();
    }
}

Quelques notes à ce sujet. L'exemple attend 5 secondes avant de faire quoi que ce soit, vous donnant la chance de donner le focus à certains de la fenêtre d'édition. Dans mon application que je suis en utilisant un raccourci clavier pour déclencher cela, mais cela ne ferait qu'augmenter la confusion de cet exemple. Aussi, dans le code de production, vous devriez vérifier les valeurs de retour des appels win32 pour voir s'ils ont réussi ou pas.

source d'informationauteur Einar Egilsson