C#, WinAPI Klick auf Menüpunkte
Ich versuche, klicken Sie auf ein Menü Element in einem Programm namens Media Subtitler und was auch immer ich versuche zu tun, es funktioniert nicht.
Erste, ich habe versucht Sie mit der Funktion GetMenu aber es kehrte IntPtr.Null.
Dann habe ich versucht mit der ALT-Taste + verwenden Sie den ersten Buchstaben von meinem Menü (F steht für file), aber es Tat nichts.
Dann habe ich versucht mit einem einfachen MOUSEDOWN-und MOUSEUP-Nachrichten, aber wieder, es Tat sich nichts (ich habe auch versucht, die Schaffung einer Schleife, klickt auf alles, was in diesem Bereich aber es war nicht auf diesen Bereich klicken).
Was ich genau weiß ist, dass ich arbeite, auf das richtige Fenster.
Was mache ich falsch?
Wenn jemand will, um es zu testen, Sie können download-Media Subtitler kostenlos und es nicht Gewicht zu viel.
Auch, Hier ist der code, den ich habe getestet:
Process p = Process.Start(@"C:\Program Files\DivXLand\Media Subtitler\MediaSub.exe");
p.WaitForInputIdle(1500);
Thread.Sleep(3000);
SetForegroundWindow(p.MainWindowHandle);
ShowWindow(p.MainWindowHandle, SW_MAXIMIZE);
IntPtr handle = p.MainWindowHandle;
SendMessage(handle, WM_NCHITTEST, 0, MakeLParam(18, 29));
//for (int i = 0; i < 200; i++)
//{
// for (int x = 0; x < 200; x++)
// {
// SendMessage(p.MainWindowHandle, WM_LBUTTONDOWN, 0, MakeLParam(i, x));
// SendMessage(p.MainWindowHandle, WM_LBUTTONUP, 0, MakeLParam(i, x));
// }
//}
//IntPtr menuItems = GetMenu(p.MainWindowHandle);
return;
//SendMessage(p.MainWindowHandle, WM_COMMAND, 6, 0);
SendMessage(p.MainWindowHandle, WM_KEYDOWN, VK_MENU, 0);
SendMessage(p.MainWindowHandle, WM_KEYUP, VK_MENU, 0);
SendMessage(p.MainWindowHandle, WM_KEYDOWN, VK_F, 0);
SendMessage(p.MainWindowHandle, WM_KEYUP, VK_F, 0);
Vielen Dank für jede Hilfe!!!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Durch die überwachung der Nachrichten an das Hauptfenster der Anwendung, ich extrahiert die Menü-Bezeichner für das Menü Elemente. Sie können post
WM_COMMAND
- Nachricht an das Fenster mit der ID des Menü-items wie derwParam
:Getestet hab ich den code mit Media Subtitler, und es funktioniert wie ein Charme! Die einzige situation, das wird nicht funktionieren, wenn Sie auf windows Vista oder Seven, Ihre Ziel-Programm wird als Administrator ausgeführt und Sie C# - Programm nicht. Sei dir dessen bewusst!
Menü-IDs können Sie leicht prüfen, durch die überwachung der
WM_COMMAND
Nachricht (mit Spy++).Sie können auch
SendMessage
stattPostMessage
, aber dann ist dein Programm einfriert, bis der Benutzer schließt das Fenster geöffnet über das Menü Aktion.Können Sie den gleichen Ansatz verwenden, um zu senden Befehl, um zu anderen Fenstern der Anwendung. Zum Beispiel, indem Sie den button 'Öffnen' des "video Öffnen" - Fenster.
Find Window
- Werkzeug aus und ziehen Sie das Fadenkreuz an die Fenster. Wenn Sie es gefunden, klicken Sie rechts darauf und wählen SieMessages
. In diesem Fenster spy++ zeigt alle Nachrichten, die gesendet und an das Fenster gebucht. Sie können Nachrichten filtern, indem SieLogging options
von derMessages
- Menü (Strg+O).Können Sie auch nicht alle diese mit dem System.Windows.Automation-namespace: http://msdn.microsoft.com/en-us/library/ms590934.aspx
Mit diesem namespace, die Sie nicht brauchen, um jedes interop mit der Win32-API. Hier ist ein Beispiel, wie man ein Fenster durch die Suche nach einer Zeichenfolge, die seinen Namen enthält:
Nachdem Sie das Fenster als AutomationElement-Objekts können Sie die Suche für Kontrollen und Operationen auf jene Kontrollen, etc.
Hoffe, das hilft!
In Visual Studio gibt es ein tool Spy++ mit dem Sie in der Lage sein sollten, um zu sehen, handhaben von Objekten.
Wenn Sie sehen, dass es dort, Sie sollten in der Lage sein, um es zu bekommen mit user32.dll Funktion
um Sie zu bekommen(der Griff anders sein wird jedes mal, wenn Sie führen Sie Ihre app)
Wenn man den rechten Griff, Sie sollten in der Lage sein zu verwenden SendMessage senden Sie die EINGABETASTE, oder klicken Sie auf.
Versucht, diese auf nur einer app, und ich benutzte es nur zum Lesen und schreiben von text, tut mir Leid, wenn es nicht funktioniert