Seite 1 von 1

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

Verfasst: 28. September 2005 08:59
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

Re: result setzen bei winEventFilter unter QT 3.3.3 ?

Verfasst: 28. September 2005 09:57
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.

Verfasst: 28. September 2005 19:14
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

Verfasst: 29. September 2005 07:46
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?

Verfasst: 29. September 2005 09:22
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 ()?

Verfasst: 29. September 2005 20:51
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 :?:

Verfasst: 29. September 2005 21:43
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.

Verfasst: 30. September 2005 19:56
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