2016-04-13 7 views
0

Ich frage mich, ob es möglich ist, Anwendung zu erstellen, die irgendwie durch alle in Windows (7,8,10) geöffneten Systemformen (nicht nur Hauptformen, sondern auch seine inneren offenen Formen) durchschaut? ZB habe ich eine Anwendung geöffnet und in ihr habe ich einige Formulare ist es möglich, zu überprüfen, ob Formular eines bestimmten Typs geöffnet ist (oder Formular, das ceratin Text in form.text -Eigenschaft hat. Oder irgendeine andere Idee, wie man Informationen darüber erhält, welche Formulare in Anwendung sind offen? :)C# ist es möglich, alle offenen Fensterformen zu durchlaufen? Wie liest man Steuerelemente aus geöffneten Formularen?

Ich habe einmal Anwendung gesehen, durch einen Kerl zu schaffen, kann diese App bestimmte Fenster öffnen und klicken Sie auf bestimmte Schaltflächen in anderen Anwendungen. Dieser Typ kann nicht wissen, was Namen für Formulare oder seine Schaltflächen für diese andere Anwendung sind, also muss er irgendwie überprüft haben, welche Formulare in dieser anderen App geöffnet sind und welche Steuerelemente sie hat. Eine andere Frage ist, wie man die Steuerelemente auf geöffneten Formularen überprüft (vor allem muss ich einige Daten aus bestimmten Textfeldern aus dem Formular lesen, die einen bestimmten Text im Header des Fensters haben.)

Ich bedauere, er benutze Winapi, aber könnten Sie eine Hilfe zur Verfügung stellen, wie man das von C# macht?

Vielen Dank für Hilfe :)

+0

Jede Form ist ein Fenster und Fenster können von api durchlaufen werden. Es liegt also an Ihnen, Ihr Fenster zu identifizieren. Im einfachsten Fall kann dies durch die Beschriftung erfolgen. –

Antwort

0

Hier finden Sie aktuelle EnumWindows Funktion

https://msdn.microsoft.com/en-us/library/windows/desktop/ms633497(v=vs.85).aspx

Und Sie alle Fenster (durch ihre Griffe gegeben - HWND) aufzählen kann wie folgt aus:

using System.Runtime.InteropServices; 
.... 

[return: MarshalAs(UnmanagedType.Bool)] 
private delegate Boolean EnumerationCallback(IntPtr handle, IntPtr parameter); 

[DllImport("User32.dll", 
      CallingConvention = CallingConvention.Winapi, 
      ExactSpelling = true, 
      EntryPoint = "EnumWindows", 
      CharSet = CharSet.Unicode, 
      SetLastError = true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
private static extern Boolean EnumWindows(
    EnumerationCallback lpEnumFunc, 
    IntPtr lParam); 

... 

EnumWindows((handle, p) => { 
    //TODO: put relevant code here 

    return true; 
    }, 
    IntPtr.Zero); 

Sie können auch EnumChildWindow API-Funktion

https://msdn.microsoft.com/en-us/library/windows/desktop/ms633494(v=vs.85).aspx

+0

Vielen Dank für alle hilfreiche Kommentare. Ich benutze es und außerdem lerne ich viel über pinvoke und hilfreiche Tools wie Spy ++ :) – romeck

Verwandte Themen