Frage

Ich versuche, den folgenden Code zu verwenden, um eine Schaltfläche auf meiner anderen Anwendung zu drücken:

HWND ButtonHandle;
if( (wnd = FindWindow(0, "Do you want to save?")) )
{   
   ButtonHandle = FindWindowEx(wnd, 0, "SaveButton", "&Save");
   SendMessage(wnd, WM_COMMAND, MAKEWORD(GetDlgCtrlID(ButtonHandle), BN_CLICKED ), (LPARAM)ButtonHandle);

}

Es funktioniert nicht. Ich habe versucht, verschiedene Griffe vorbei MAKEWORD und die WPARM und LPARAM aber nichts zu ändern.

Alle Ideen, wie eine Taste auf einer anderen Anwendung Fenster klicken?

-Code wird geschätzt. Danke.

EDIT: Der Grund ist es nicht Berechtigungen zu funktionieren scheint. Ich habe eine Postmessage () und das Ergebnis war ein Fehler mit GetLastError () = 5 (oder Zugriff verweigert). Irgendwelche Ideen?

EDIT2 Ich will nicht unhöflich sein, aber bitte, bitte, bitte, ich suchte bereits alle APIs einschließlich bekommen und die Regionen für die Schaltfläche festlegen und dann eine Taste gedrückt und zuknöpfen senden, bekommen die Steuer-ID, bekommen die Klassen-ID und eine Unmenge mehr. Der Grund, warum ich die Frage gestellt, hier in erster Linie, weil ich meine Suche bereits im Internet erschöpft. Wenn Sie die Antwort senden Sie uns bitte POST CODE , keine API vorschlagen und das ist es, mir zeigen, wie sich das API das Problem löst. Es ist nicht schwer. Dankeschön.

EDIT 3: Die Antwort auf die Frage wurde automatisch ausgewählt, wenn die Prämie beendet. Es bleibt die Frage unbeantwortet.

War es hilfreich?

Lösung

  1. Sind Sie sicher, dass „Savebutton“ Klassenname gültig ist? Bekommen Sie die Taste Griff?
  2. Versuchen Sie Nachrichten an ButtonHandle Fenster (direkt auf die Schaltfläche) senden.

Update: Ich glaube, das sollte funktionieren,

SendMessage(ButtonHandle, BM_CLICK, 0, 0);

Andere Tipps

SendMessage(btnHandle, WM_LBUTTONDOWN, 0, 0);
SendMessage(btnHandle, WM_LBUTTONUP, 0, 0);
SendMessage(btnHandle, WM_LBUTTONDOWN, 0, 0);
SendMessage(btnHandle, WM_LBUTTONUP, 0, 0);

Sie haben zweimal einen Button-Klick zu senden. Nicht sicher, warum (vielleicht der erste Klick aktiviert nur das Fenster der Taste), aber ich bin mit diesen Code für eine lange Zeit und es hat funktioniert immer für mich.

Sehen Sie die folgende Lösung, auch können Sie

SendMessage(ButtonHandle, WM_LBUTTONDOWN, 0, 0);
SendMessage(ButtonHandle, WM_LBUTTONUP, 0, 0);

oder

SendMessage(ButtonHandle, BM_CLICK, 0, 0);

HWND buttonHandle = 0;

BOOL CALLBACK GetButtonHandle(HWND handle, LPARAM)
{
 char label[100];
 int size = GetWindowTextA(handle,label,sizeof(label));
 if(strcmp(label,"&Save") == 0)
 {
  buttonHandle = handle;
  return false;
 }
 return true;
}
void main()
{
 HWND windowHandle = FindWindowA(NULL,"Do you want to Save?");
 if(windowHandle != 0)
 {
  BOOL ret = EnumChildWindows(windowHandle,GetButtonHandle,0);

  if(buttonHandle != 0)
  {
   LRESULT res = SendMessage(buttonHandle,BM_CLICK,0,0);
   //SendMessage(buttonHandle,WM_LBUTTONDOWN,0,0); 
   //SendMessage(buttonHandle,WM_LBUTTONUP,0,0);
  }

 }



}

Hinweis: Immer sicher aus dem Fenster Text, Button Text (überprüfen, ob es Platz am Ende des Fenstertitels ist)

Zugriff verweigert Fehler auf Sendmessage oder Postmessage machen keinen Sinn, es sei denn, der Prozess die Nachricht gesendet wird, auf einem niedrigeren Niveau als die Integrität der Zielprozess ausgeführt wird.

Das sollte nicht passieren, wenn der Prozess, der das Zielfenster besitzt wird run „asAdministrator“ zu sein oder ist eine Dienstleistung. Und sein verdammt hart für Dienste-Fenster auf dem interaktiven Desktop mit Windows-6 zu erstellen und auf.

Sie können einige Lesen Sie über Integrity Levels Hier , wenn sie gelten auch nur entfernt auf diese Situation. Internet Explorer ist über die einzige andere Anwendung, dass ‚entscheidet sich in‘, um die Integrität Sicherheitsmodell durch absichtlich die Integrität Niveau sich um Sandbox senken sich effektiver.

Wenn Sie das Fenster erhöhen können auf die Schaltfläche enthalten, können Sie rohes Maus-Ereignis in eine Position innerhalb der Grenzen der Taste senden.

Es gibt zwei Funktionsmausereignis zu simulieren Send und mouse_event . Ich empfehle, mit mouse_event Funktion. So erhöhen Sie ein Fenster, das Sie verwenden können, Showwindow. Ich weiß nicht, wie der Griff eines Knopfes zu bekommen, aber wenn man seine hWnd seine leicht seine absolute Position mit GetWindowRect Funktion. Versuchen Sie diese verwenden, wenn Sie irgendwelche Probleme stoßen auf ich froh sein, zu helfen.

oder eine benutzerdefinierte WM in Ihrer Anwendung definieren Fenster verarbeiten Anfrage zu speichern. WM_CUSTOM oder WM_USER (kippt erinnern, welche) markiert den Beginn von benutzerdefinierten Fenstermeldungen.

Wenn ich diese Art von Dingen zu tun habe ich Tastaturbefehle verwenden. Es ist VB-ish und C # bietet eine schöne Oberfläche zu verwenden, aber für C / C ++ werden Sie es zu tun haben, << a href = „http://www.codeproject.com/KB/cpp/sendkeys_cpp_Article.aspx“ rel = "nofollow noreferrer"> diese Art und Weise >. Was mit ihm schön ist, dass Sie Skripte schreiben könnten, und führen Sie sie statt schwer es in Ihrem Code-Codierung.

Microsoft jetzt treibt Active Accessibility (MSAA) für UI Automation, (Es wurde mehrmals im Laufe der Jahre umbenannt)  siehe

Sorry, ich habe keinen einfachen Code zum Einstieg. Als „Sendmessage ()“ scheint nicht für Sie zu arbeiten, weiß ich nicht von einer anderen Option außer „UI Automation“

Ich gehe davon aus Sie mit Spy haben überprüfen ++ (installiert mit MsDev), die Sie Nachricht an die richtige Taste etc senden werden - und dass der Knopf ist ein Standard-Windows-Tasten. Mein erster Augenblick würde die Verwendung „Sendmessage ()‚oder‘Postmessage ()“, aber angesichts der Zahl der Antworten zu ‚Sendmessage ()‘ sagen und die Tatsache, es funktioniert nicht für Sie. Ich erwarte, dass jemand geht auf ...

Sie können die Tastaturbefehle verwenden (wie TR3 sagte) Mausklicks zu senden, die als die Verwendung von Sendmessage unterscheidet. Es ist auch weniger direkte und mehr hack-ish, aber ist nützlich für die Automatisierung (in VBS).

Auch nur eine Vermutung, aber das Problem könnte sein, dass Ihre Nachricht Handhabung von nicht Aufruf der Basisklasse Mitglied irgendwo gebrochen. Beispiel:

void CMyClass::OnMessageY(CWnd *cwnd)
{
    CBaseClass::OnMessageY(cwnd);
    //... my code
}

, wenn Sie sicher ButtonHandle gilt Greifen Sie Paar WM_LBUTTONDOWN und WM_LBUTTONUP Nachricht statt BN_CLICKED verwenden

HWND ButtonHandle;
if( (wnd = FindWindow(0, "Do you want to save?")) )
{   
    SendMessage(ButtonHandle, WM_LBUTTONDOWN, MK_LBUTTON, 0);
    SendMessage(ButtonHandle, WM_LBUTTONUP, MK_LBUTTON, 0);
}

Ein nicht-C Ansatz: Verwenden Sie Java und die java.awt.Robot Klasse, um die Maus zu bewegen führen, um reale Klicks (Ich denke, es ist etwas in der Windows-Welt dafür ist, auch). Problem: Sie müssen wissen, wo Ihre Schaltfläche ist: D

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top