[gelöst] result setzen bei winEventFilter unter QT 3.3.3 ?

Alles rund um die Programmierung mit Qt
Antworten
awika
Beiträge: 8
Registriert: 26. September 2005 20:50

[gelöst] result setzen bei winEventFilter unter QT 3.3.3 ?

Beitrag von awika »

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
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Re: result setzen bei winEventFilter unter QT 3.3.3 ?

Beitrag von macman »

awika hat geschrieben:Oder bleibt mir nichts anderes übrig, als auf QT 4.0.1 upzudaten?
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.

Code: Alles auswählen

bool MyQApplication::winEventFilter( MSG *msg )
{
	if (msg->message == WM_MOUSEACTIVATE)
		return true;

	QApplication::winEventFilter( msg );
	return true;
}
Du kannst natürlich auch die Message ändern und dann an qApp weiter geben. Hab es nie getestet, so würde ich es aber angehen.
awika
Beiträge: 8
Registriert: 26. September 2005 20:50

Beitrag von awika »

Hallo macman

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;
}
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

Code: Alles auswählen

bool MyQApplication::winEventFilter( MSG *msg )
{
   if (msg->message == WM_MOUSEACTIVATE)
      return true;

   QApplication::winEventFilter( msg );
   return true;
}
habe ich auch probiert, aber ich denke wenn nichts verändert werden soll muss man false zurückgeben.
If you don't want the event to be processed by Qt, then return true. Otherwise return false.
Irgendwie sollten sich doch diese 2 Zeilen Visual C++ in QT umsetzen lassen :?

Code: Alles auswählen

int CKeyButton::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
{
return MA_NOACTIVATE;
}

awika
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

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.
Wenn Du die Message änderst, mußt Du sie auch der Applikation zur Bearbeitung geben.

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;
}
Vielleicht hilft das schon.
awika hat geschrieben:Das Programm bekommt beim Anklicken immer noch den Focus und das darf nicht sein.
Und das funktioniert mit den 2 Zeilen Code, die Du uns genannt hast?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

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;
}
Das ist totaler Humbug!
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
awika
Beiträge: 8
Registriert: 26. September 2005 20:50

Beitrag von awika »

Hallo macman, Hallo Christian81,

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;
} 
hat nicht gebracht. Ich habe auch alle Varianten ausprobiert .


Und das funktioniert mit den 2 Zeilen Code, die Du uns genannt hast?
Ja , siehe
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.
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;

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;
}
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 :cry:

Hallo Christian81
Kann ich mit
QFocusEvent inklusive der Funktion Reason QFocusEvent::reason ()?
auch verhindern, dass das andere Programm den Focus verliert, wenn mein Programm angeklickt wird? und wenn ja, wie geht das :?:
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

awika hat geschrieben:

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;
}
Leider ohne Erfolg.
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...

Code: Alles auswählen

*result=MA_NOACTIVATE;
So könnte es evtl. dann gehen...
awika hat geschrieben: Hallo Christian81
Kann ich mit
QFocusEvent inklusive der Funktion Reason QFocusEvent::reason ()?
auch verhindern, dass das andere Programm den Focus verliert, wenn mein Programm angeklickt wird? und wenn ja, wie geht das :?:
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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
awika
Beiträge: 8
Registriert: 26. September 2005 20:50

Beitrag von awika »

Hallo Christian81,
vielen Dank für die Hilfe :D

Code: Alles auswählen

*result=MA_NOACTIVATE; 
Das wars. Peinlich, Peinlich. :oops:

Jetzt funktioniert es!

Danke auch an macman für die Tipps.

Viele Grüße
awika
Antworten