Question

Comment lire la surbrillance / texte sélectionné à partir d'une fenêtre en utilisant c #.

J'ai essayé 2 approches.

  1. Envoyer « ^ c » chaque fois que l'utilisateur sélectionne quelque chose. Mais dans ce cas, mon presse-papier est inondé avec beaucoup de données inutiles. Parfois, il copie des mots de passe aussi.

donc je changé mon approche de la 2ème méthode, Méthode d'envoi de message.

voir le code échantillon

 [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);     

   // second overload of SendMessage

    [DllImport("user32.dll")]
    private static extern int SendMessage(IntPtr hWnd, uint Msg, out int wParam, out int lParam);

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

private string PerformCopy()
    {
        try
        {
            //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);

            return builder.ToString();
        }
        catch (System.Exception oException)
        {
            throw oException;
        }
    }

ce code fonctionne bien dans le Bloc-notes. Mais si je tente de capturer d'autres applications telles que Mozilla Firefox ou Visual Studio IDE, il ne revient pas le texte.

Quelqu'un peut-il aider moi s'il vous plaît, où je fais mal? Tout d'abord, j'ai choisi la bonne approche?

Était-ce utile?

La solution

En effet, Firefox et Visual Studio ne pas utiliser les commandes Win32 intégré pour l'affichage / l'édition de texte.

Il est impossible en général pour être en mesure d'obtenir la valeur de « tout » texte sélectionné, en raison du fait que les programmes peuvent réimplémenter leur propre version de Win32 contrôle toute façon, ils voir en forme, et votre programme ne peut pas attendre peut-être travailler avec tous.

Cependant, vous pouvez utiliser les API UI Automation qui vous permettent d'interagir avec majorité des contrôles 3e partie (au moins, tous les bons - tels que Visual studio et Firefox - travaillera probablement avec les API UI automation car il est une exigence d'accessibilité)

scroll top