FindWindowEx aus user32.dll ist die Rückgabe ein handle, Null und error code 127 verwenden von dllimport
Ich brauche, um zu behandeln eine andere windows-Anwendung ein Programm, google-Suche fand ich eine Probe, die Griffe windows-Rechner mit DLLImport-Attribut und dem Import der user32.dll Funktionen in managed in C#.
Dem die Anwendung ausgeführt wird, bekomme ich das handle für das Hauptfenster, also Taschenrechner an sich, sondern das danach-code funktioniert nicht. Die FindWindowEx-Methode ist nicht Rückgabe des handles für die Kinder der Rechner wie buttons und textbox.
Habe ich versucht, SetLastError=True auf DLLImport und fand, dass ich immer ein error code 127 die "Prozedur nicht gefunden".
Dies ist der link von wo ich Beispiel-Anwendung:
http://www.codeproject.com/script/Articles/ArticleVersion.aspx?aid=14519&av=34503
Bitte um Hilfe wenn jemand weiß wie es zu lösen.
UPDATE: Das DLLImport ist:
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
Den Code, der nicht funktioniert ist:
hwnd=FindWindow(null,"Calculator"); //This is working, I am getting handle of Calculator
//The following is not working, I am getting hwndChild=0 and err = 127
hwndChild = FindWindowEx((IntPtr)hwnd,IntPtr.Zero,"Button","1");
Int32 err = Marshal.GetLastWin32Error();
- Welche Windows-version verwendest du?
- Wenn Sie ein problem mit P/Invoke, posten Sie Ihre Erklärung mit der
DllImport
Attribut. Wenn Sie ein problem mit dem code, poste den code, der nicht funktioniert. - Ich bin mit Windows 7 Professional.
- Ich update meine Frage und enthalten den code, der nicht funktioniert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den code, den Sie versuchen, stützt sich auf die Beschriftungen der einzelnen buttons, um diese zu identifizieren. Es nutzt beispielsweise den folgenden code, um ein handle zu der "+ 1" - Schaltfläche:
Welche gibt "Button" für den Namen der Fenster-Klasse, und "1" für den Namen des Fensters (in dem Fall ein button, dieser ist der gleiche wie der Beschriftung text, der angezeigt wird auf der Taste selbst).
Dieser code funktionierte einwandfrei unter Windows XP (und früheren Versionen), wo die Rechner-Schaltflächen wurden identifiziert, die mit textuellen Beschriftungen. Die "1" - Schaltfläche hatte ein Fenster namens "1" und somit "1" angezeigt wurde, als Sie die Beschriftung der Schaltfläche.
Jedoch, wie es aussieht, haben sich die Dinge geändert, die unter Windows 7 (evtl. auch unter Vista kann ich zwar nicht verifizieren, da ich keinen Zugang zu einem solchen system). Mit Spy++ zu untersuchen, die calculator-Fenster bestätigt, dass die "1" - Schaltfläche nicht mehr hat ein Fenster mit Namen "1". In der Tat, es muss nicht ein Fenster namens überhaupt; die Beschriftung ist NULL. Vermutlich sind die neuen fancy Aussehen des Rechners erforderlich, die Tasten individuell gezeichnet, damit die Beschriftungen sind nicht mehr notwendig, zu zeigen, welche Taste entspricht die Funktion. Der custom-painting-Routinen kümmern sich um den Entwurf der entsprechenden Bildunterschriften.
Da keine Taste finden, mit der Fenster-text von Ihnen angegebenen, ein Wert von 0 (
NULL
) zurückgegeben wird, für den Fenster-handle.Den Dokumentation für die
FindWindowEx
- Funktion zeigt an, dass Sie angeben könnenNULL
für dielpszWindow
parameter, aber natürlich passen alle windows von der angegebenen Klasse. Wahrscheinlich nicht das, was Sie wollen, in diesem Fall, wie die Taschenrechner-app hat eine Reihe von Schaltflächen.Weiß ich nicht umgehen. Taschenrechner war nicht entworfen, um eine "automatisierte" auf diese Weise, und Microsoft nie garantiert, dass Sie sich nicht ändern Ihre internen Abläufe. Das ist ein Risiko, das Sie nehmen mit diesem Ansatz, um Durcheinander mit den Fenstern anderer Anwendungen.
EDIT: den code, Den Sie gelinkt hast ist auch falsch, in einem anderen ziemlich schweren Weg, auch auf früheren Windows-Versionen. Es erklärt die
hwnd
variable als Typint
eher als TypIntPtr
. Da ein Fenster-handle ist ein Zeiger, sollten Sie immer speichern Sie es als eineIntPtr
geben. Das behebt auch das hässliche Besetzung in derFindWindowEx
Funktion aufrufen, sollten haben gesendet, bis die roten Fahnen.Müssen Sie auch fix die Erklärung der
SendMessage
so, dass der erste parameter ist der TypIntPtr
.Den code geschrieben werden sollte, wie diese:
""
oderNULL
. Programmgesteuert, es wird schwierig, einen Weg zu finden, zu identifizieren, die einzelnen Tasten, nur Ihre Handgriffe.HWND
sollte konvertierbar zu einemint
und zurück just fine.int
wird arbeiten oft für Griffe, es ist nicht der richtige Weg, Dinge zu tun. Sie sollenIntPtr
, nicht den Vorteil der Abwärtskompatibilität. 🙂Ich war in der Lage reproduzieren diese auf Win7 Pro. Ihr problem ist wahrscheinlich, dass die Beschriftungen auf den Schaltflächen gezeichnet werden über das Thema der Taschenrechner und nicht als überschrift. Wenn Sie den Design-Dienst ausgeführt wird, starten Rechner wird dazu führen, dass Tasten ohne Beschriftung.
Um die richtige button-Beschriftungen, müssen Sie:
net stop themes
aus einer erhöhten Eingabeaufforderung, oder verwenden Sie die Services administrative tool).Wenn Sie Rechner laufen, wenn Sie aufhören, die Themen service, werden Sie feststellen, dass alle buttons leer.
Folgende code funktioniert in Caculator von Windows 7 im Klassischen Design (nicht arbeiten im Basic oder Aero-Design):
==================================================