[gelöst] result setzen bei winEventFilter unter QT 3.3.3 ?
[gelöst] result setzen bei winEventFilter unter QT 3.3.3 ?
Hallo,
mein Problem ist leider noch nicht ganz gelöst, aber ich bin schon einen guten Schritt weiter.
Gibt es eine Möglichkeit auch bei QT 3.3.3 und der Methode winEventFilterbei dem Windows EreignisWM_MOUSEACTIVATE den Rückgabewert auf MA_NOACTIVATE zu setzen?
Visual C++ Beispiel:
int KeyDlg::OnMouseActivate( CWnd* pDesktopWnd, UINT nHitTest, UINT message )
{
return MA_NOACTIVATE;
}
Oder bleibt mir nichts anderes übrig, als auf QT 4.0.1 upzudaten?
QT 4: bool QCoreApplication::winEventFilter ( MSG * msg, long * result )
QT 3.3.3: bool QApplication::winEventFilter ( MSG * )
awika
mein Problem ist leider noch nicht ganz gelöst, aber ich bin schon einen guten Schritt weiter.
Gibt es eine Möglichkeit auch bei QT 3.3.3 und der Methode winEventFilterbei dem Windows EreignisWM_MOUSEACTIVATE den Rückgabewert auf MA_NOACTIVATE zu setzen?
Visual C++ Beispiel:
int KeyDlg::OnMouseActivate( CWnd* pDesktopWnd, UINT nHitTest, UINT message )
{
return MA_NOACTIVATE;
}
Oder bleibt mir nichts anderes übrig, als auf QT 4.0.1 upzudaten?
QT 4: bool QCoreApplication::winEventFilter ( MSG * msg, long * result )
QT 3.3.3: bool QApplication::winEventFilter ( MSG * )
awika
Re: result setzen bei winEventFilter unter QT 3.3.3 ?
Sehe ich das richtig? Du willst das Ereignis WM_MOUSEACTIVATE abfangen und im Nirwana verschwinden lassen? Dann fang es ab und gib es einfach nicht weiter.awika hat geschrieben:Oder bleibt mir nichts anderes übrig, als auf QT 4.0.1 upzudaten?
Code: Alles auswählen
bool MyQApplication::winEventFilter( MSG *msg )
{
if (msg->message == WM_MOUSEACTIVATE)
return true;
QApplication::winEventFilter( msg );
return true;
}Hallo macman
Vielen Dank für die Hilfe. Leider klappt es nicht.
In die if-Anweisung springt er ja noch rein ( Globale Variable str wird beim Anklicken der Anwendung auf "ok" gesetzt und in einem Timer ausgegeben) aber das Event verschwindet nicht.
Das Programm bekommt beim Anklicken immer noch den Focus und das darf nicht sein.
die Variante
habe ich auch probiert, aber ich denke wenn nichts verändert werden soll muss man false zurückgeben.
awika
Vielen Dank für die Hilfe. Leider klappt es nicht.
Code: Alles auswählen
bool MyApp::winEventFilter( MSG *msg )
{
if (msg->message == WM_MOUSEACTIVATE)
{
str="ok";
msg->message=MA_NOACTIVATE;
return true;
}
QApplication::winEventFilter( msg );
return false;
}
Das Programm bekommt beim Anklicken immer noch den Focus und das darf nicht sein.
die Variante
Code: Alles auswählen
bool MyQApplication::winEventFilter( MSG *msg )
{
if (msg->message == WM_MOUSEACTIVATE)
return true;
QApplication::winEventFilter( msg );
return true;
}Irgendwie sollten sich doch diese 2 Zeilen Visual C++ in QT umsetzen lassenIf you don't want the event to be processed by Qt, then return true. Otherwise return false.
Code: Alles auswählen
int CKeyButton::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
{
return MA_NOACTIVATE;
}
awika
Wenn Du die Message änderst, mußt Du sie auch der Applikation zur Bearbeitung geben.awika hat geschrieben:In die if-Anweisung springt er ja noch rein ( Globale Variable str wird beim Anklicken der Anwendung auf "ok" gesetzt und in einem Timer ausgegeben) aber das Event verschwindet nicht.
Code: Alles auswählen
bool MyApp::winEventFilter( MSG *msg )
{
if (msg->message == WM_MOUSEACTIVATE)
{
str="ok";
msg->message=MA_NOACTIVATE;
QApplication::winEventFilter( msg );
return true;
}
QApplication::winEventFilter( msg );
return false;
}
Und das funktioniert mit den 2 Zeilen Code, die Du uns genannt hast?awika hat geschrieben:Das Programm bekommt beim Anklicken immer noch den Focus und das darf nicht sein.
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Code: Alles auswählen
bool MyApp::winEventFilter( MSG *msg )
{
if (msg->message == WM_MOUSEACTIVATE)
{
str="ok";
msg->message=MA_NOACTIVATE;
QApplication::winEventFilter( msg );
return true;
}
QApplication::winEventFilter( msg );
return false;
}
MA_NOACTIVATE ist keine Message sondern ein Return-Value auf die Message WM_MOUSEACTIVATE. Da Qt3 nur true oder false als Rückgabe akzeptiert, geht es nicht (zumindest nicht ohne den internen Aufbau der Qt-Messageloop zu kennen - wenn sie den Return-Wert einfach weiterleitet, würde es evtl. mit wilden casts gehen).
Warum benutzt du nicht einfach QFocusEvent inklusive der Funktion Reason QFocusEvent::reason ()?
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
Hallo macman, Hallo Christian81,
hat nicht gebracht. Ich habe auch alle Varianten ausprobiert .
http://www.codeproject.com/samples/onsc ... ect=718753
Das Programm hat ursprünglich auch bei jedem Tastendruck den Focus bekommen. Weiter unten auf der Seite dann der Tipp:
Nach den Änderungen klappt es (selbst ausprobiert). Nur wie geht das mit QT???
Ich habe das Programm heute unter QT 4.0.1 getestet: Meine Hoffnung lag auf der " long * result" Variable. "back" ist vom Typ long;
Leider ohne Erfolg. In die if-Anweisung geht das Programm bei Tastendruck rein, str wird auf 33 gesetzt ( wohl der Code von WM_MOUSEACTIVATE). Aber den Focus erhält er trotzdem
Hallo Christian81
Kann ich mit
Code: Alles auswählen
bool MyApp::winEventFilter( MSG *msg )
{
if (msg->message == WM_MOUSEACTIVATE)
{
str="ok";
msg->message=MA_NOACTIVATE;
QApplication::winEventFilter( msg );
return true;
}
QApplication::winEventFilter( msg );
return false;
} Ja , sieheUnd das funktioniert mit den 2 Zeilen Code, die Du uns genannt hast?
http://www.codeproject.com/samples/onsc ... ect=718753
Das Programm hat ursprünglich auch bei jedem Tastendruck den Focus bekommen. Weiter unten auf der Seite dann der Tipp:
Code: Alles auswählen
Hello, I've solved the focus problem. The solution is to catch the WM_MOUSEACTIVATE message and return MA_NOACTIVATE.
Changes in OnscreenKeyboardDlg.cpp:
BEGIN_MESSAGE_MAP(COnscreenKeyboardDlg, CDialog)
...
ON_WM_MOUSEACTIVATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
int COnscreenKeyboardDlg::OnMouseActivate( CWnd* pDesktopWnd, UINT nHitTest, UINT message )
{
return MA_NOACTIVATE;
}
Changes in OnscreenKeyboardDlg.h:
//{{AFX_MSG(COnscreenKeyboardDlg)
...
afx_msg int OnMouseActivate( CWnd* pDesktopWnd, UINT nHitTest, UINT message );
...
//}}AFX_MSG
That's all.
Ich habe das Programm heute unter QT 4.0.1 getestet: Meine Hoffnung lag auf der " long * result" Variable. "back" ist vom Typ long;
Code: Alles auswählen
bool MyApp::winEventFilter( MSG * msg, long * result )
{
if (msg->message == WM_MOUSEACTIVATE)
{
str.setNum(msg->message);
back=MA_NOACTIVATE;
result=&back;
// QApplication::winEventFilter( msg ,result);
return true;
}
QApplication::winEventFilter( msg ,result);
return false;
}
Hallo Christian81
Kann ich mit
auch verhindern, dass das andere Programm den Focus verliert, wenn mein Programm angeklickt wird? und wenn ja, wie geht dasQFocusEvent inklusive der Funktion Reason QFocusEvent::reason ()?
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Schau Dir bitte mal an wie du versuchtst einen Wert in result zu setzen! Ich glaube es nützt nichts wenn Du die übergebene Adresse änderst... Du solltest schon den Wert ändern...awika hat geschrieben:Leider ohne Erfolg.Code: Alles auswählen
bool MyApp::winEventFilter( MSG * msg, long * result ) { if (msg->message == WM_MOUSEACTIVATE) { str.setNum(msg->message); back=MA_NOACTIVATE; result=&back; // QApplication::winEventFilter( msg ,result); return true; } QApplication::winEventFilter( msg ,result); return false; }
Code: Alles auswählen
*result=MA_NOACTIVATE;
Nein, das geht nicht - ich dachte Du willst Qt-intern verhindern das ein anderes Widget den Focus bekommt - dann wäre das die beste (weil auch platformübergriefend) Idee.awika hat geschrieben: Hallo Christian81
Kann ich mitauch verhindern, dass das andere Programm den Focus verliert, wenn mein Programm angeklickt wird? und wenn ja, wie geht dasQFocusEvent inklusive der Funktion Reason QFocusEvent::reason ()?
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
Hallo Christian81,
vielen Dank für die Hilfe
Das wars. Peinlich, Peinlich.
Jetzt funktioniert es!
Danke auch an macman für die Tipps.
Viele Grüße
awika
vielen Dank für die Hilfe
Code: Alles auswählen
*result=MA_NOACTIVATE;
Jetzt funktioniert es!
Danke auch an macman für die Tipps.
Viele Grüße
awika