?
Eine kleine Rückmeldung meinerseits.
Wie es aussieht arbeitet jedes Ribon-Element wie ein eigenes Programmfenster, das über einen anderen Weg als über das Nachrichtensystem mit dem Hauptprogramm komuniziert.
Ich habe es jetzt so gelöst, dass ich die aktuelle Mausposition zwischenspeichere, die Maus programmgesteuert durch die Gegend fahre & klicke und dann wieder auf die Ursprungsposition zurückstelle.
Das ist zwar nicht sauber, aber es funktioniert.
Ein kleines Beispiel:
.
.
.
// Zuerst das Fenster recursiv im Fensterbaum suchen
CSearchWnd cSearch;
CWnd* cWnd = cSearch.Recurse( FindWindow(_T("Klassenname des Haupt-Programmfensters"),NULL),
_T("Name des Ribonelements"),
CSearchWnd::enSuchartFenstername);
if(cWnd == NULL)
{
MessageBox( _T("Das Eingabeelement konnte nicht gefunden werden."),
DEF_UEBERSCHRIFT_MESSAGEBOX,
MB_ICONEXCLAMATION);
return -1;
}
CPoint cCursorPointOld;
// Zielposition relativ zum Ribonelement
CPoint cCursorPointNew(DEF_POS_RIBON_NAECHSTE_LOESUNG_X,DEF_POS_RIBON_NAECHSTE_LOESUNG_Y);
// Alte Mausposition sichern
if(!GetCursorPos(&cCursorPointOld))
{
MessageBox( _T("Fehler beim Ermitteln der Mausposition."),
DEF_UEBERSCHRIFT_MESSAGEBOX,
MB_ICONEXCLAMATION);
return -2;
}
// Neue Mausposition ermitteln
cWnd->ClientToScreen(&cCursorPointNew);
// Maus auf die gewünschte Position bewegen
if(!SetCursorPos(cCursorPointNew.x,cCursorPointNew.y))
{
MessageBox( _T("Fehler beim Setzen der Mausposition."),
DEF_UEBERSCHRIFT_MESSAGEBOX,
MB_ICONEXCLAMATION);
return -3;
}
//Einal klicken
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
// Und wieder zurück
if(!SetCursorPos(cCursorPointOld.x,cCursorPointOld.y))
{
MessageBox( _T("Fehler beim Zurücksetzen der Mausposition."),
DEF_UEBERSCHRIFT_MESSAGEBOX,
MB_ICONEXCLAMATION);
return -4;
}
return 1;