2011-01-04 8 views
2

Ich versuche, einige Automatisierung von Windows-Anwendungen zu tun. Um zu tun, was auch immer ich tun möchte, brauche ich die Fenstergriffe einiger Steuerelemente.Suchen Fenstergriff einer Multifunktionsleiste Schaltfläche

Zuvor würde ich dies mit einer Kombination EnumWindows, EnumChildWindows und GetWindowText erreichen. Aber jetzt haben einige neuere Programme keine Symbolleiste mit Schaltflächen mehr. Stattdessen haben sie ein Band.

Das erschien mir anfangs nicht sonderlich problematisch, aber jetzt merke ich, dass die Schaltflächen in der Multifunktionsleiste in EnumChildWindows nicht angezeigt werden! Oder mindestens GetWindowText gibt nicht den gleichen Text wie der auf dem Bildschirm angezeigt.

Also um eine lange Geschichte kurz zu machen: Kann mir jemand sagen, wie ich programmatisch den Griff eines Knopfes auf einem Band finden kann?

Danke. Grüße, ldx

Antwort

0

Okay,

So war es in der Tat nicht möglich, einen Handgriff auf diese Buttons zu erhalten. Ich löste das, indem ich SendKeys verwendete, um die Tastaturverknüpfung zu senden, die die Schaltfläche aktiviert. In meinem Fall war es die Taste speichern, so habe ich

INPUT inputs[4]; 
    // press control 
    inputs[0].type = INPUT_KEYBOARD; 
    inputs[0].ki.wVk = 0x11; // "VK_Control"  
    inputs[0].ki.wScan = 0; 
    inputs[0].ki.dwFlags = 0; 
    inputs[0].ki.time = 0; 
    inputs[0].ki.dwExtraInfo = 0;  

    // press "s" 
    inputs[1].type = INPUT_KEYBOARD; 
    inputs[1].ki.wVk = 0x53; // "s" 
    inputs[1].ki.wScan = 0; 
    inputs[1].ki.dwFlags = 0; 
    inputs[1].ki.time = 0; 
    inputs[1].ki.dwExtraInfo = 0;  

    // release "s" 
    inputs[2].type = INPUT_KEYBOARD; 
    inputs[2].ki.wVk = 0x53; // "s" 
    inputs[2].ki.wScan = 0; 
    inputs[2].ki.dwFlags = KEYEVENTF_KEYUP; 
    inputs[2].ki.time = 0; 
    inputs[2].ki.dwExtraInfo = 0;  

    // release control 
    inputs[3].type = INPUT_KEYBOARD; 
    inputs[3].ki.wVk = 0x11; // "VK_Control"  
    inputs[3].ki.wScan = 0; 
    inputs[3].ki.dwFlags = KEYEVENTF_KEYUP; 
    inputs[3].ki.time = 0; 
    inputs[3].ki.dwExtraInfo = 0;  

    return SendInput(8, inputs, sizeof(INPUT)) == 8; 

Vielleicht kann dies mit dem gleichen Problem für andere Ideen laichen :)

Gr, ldx

1

Verwenden Sie Spy ++ im Lieferumfang von Visual Studio (oder einem anderen ähnlichen Tool), um zu sehen, ob diese Schaltflächen tatsächlich Windows sind. Wenn ja, sehen Sie die detaillierten Informationen über sie mit diesem Tool. Es ist jedoch sehr wahrscheinlich, dass diese App sie selbst im übergeordneten Fensterkontext zeichnet. In diesem Fall können Sie das Fensterhandle nicht abrufen, da es sich nicht um echte Fenster handelt.

2

Einfach gesagt, ich glaube nicht, dass Sie können. Immer mehr Windows-Anwendungen verwenden GUI-Frameworks, die keine Steuerelemente mit diskreten untergeordneten Fenstern darstellen. Das Ribbon-UI-Framework scheint einer davon zu sein.

Die einzige Möglichkeit zum Auflisten von Steuerelementen in einer Anwendung, die keine untergeordneten Fenster verwendet, ist die Verwendung der APIs für die Barrierefreiheit: Windows Automation API: UI Automation ist der Ausgangspunkt in der Dokumentation.

0

Sie können den Griff des Fensters, das Sie ein Band nennen. Aber Sie können nicht handhaben, was Sie eine Schaltfläche nennen.

Logisch: Was nennst du einen Griff? Willst du eine HWND? Wenn Sie ein HWND wollen, dann müssen Sie ein Fenster ... aber das einzige Fenster, das Sie haben, ist das Band.

Dies wird als fensterlose Programmierung bezeichnet.

Sie könnten jedoch eine COM-Technologiekomponente verwenden: die COM-Schnittstelle IAccesible.

Verwandte Themen