F1 Taste daran hindern, WinHelp.exe aufzurufen

Kriz

Mitglied
Hallo,

wie das Topic bereits verrät, versuche ich krampfhaft CDialog daran zu hindern, beim Druck auf F1 die WinHelp.exe aufzurufen. Ich möchte, daß bei F1 eine Webseite aufgerufen wird, was auch problemlos klappt. Nur startet er jedesmal den Versuch, auch die (nichtvorhandene) .HLP Datei aufzurufen.

Wie kann ich meinen Dialog elegant dazu zwingen, mit diesem Mist aufzuhören? Alle Messages werden bereits pre-translated (sonst funktionieren die Accelerators in einem Dialog ja nicht).

Dieser Punkt ist mir sehr wichtig, daher wäre ich für jede Hilfe dankbar.

PS: Ich nutze VC++ 6.0 Standard Edition und der Dialog wurde mit dem Wizard erstellt.
 
Was heisst, die werden bereits pre-translated? Warum fängst du dann nicht dort das F1 ab?

Du kannst dem Dialog die PreTranslateMessage()-Methode verpassen. Die bekommt vor dem Aufruf der WindowProc() alle eingehenden Messages und man kann dort sehr gut Nachrichten abfangen, die nicht (oder anderes) weiterverarbeitet werden sollen.

Prüf in der Methode, ob F1 gedrückt wurde (per KEY_DOWN oder so) und wenn es der Fall ist, ruf deine Webseite auf. Gib ihn PreTranslateMessage() TRUE zurück, wenn das Framework die Nachricht nicht weiterverarbeiten (==ignorieren) soll, weil du sie selbst behandelt hast.
 
Moin Kachelator,

das pre-translaten brauche ich, wenn ich die Menü-Accelerators benutzen möchte. Ohne reagiert das Fenster nicht drauf. Nun gut, hier erstmal mein Code:

Code:
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) 
   {
  	if(pMsg->message>=WM_KEYFIRST && pMsg->message<=WM_KEYLAST)
   	{
   		if(m_hAccel && ::TranslateAccelerator(m_hWnd, m_hAccel, pMsg))
   		{
   			// F1 erstmal so abfangen
   			if(pMsg->wParam == VK_F1)
   			{
 				MessageBox(_T("F1 wurde gedrückt"));
   			}
   			else return TRUE;
   		}
   	}
   	
   	return CDialog::PreTranslateMessage(pMsg);
   }

Jetzt wird die in der MessagePump hinterlegte Aktion für F1 (nämlich der HTML-Aufruf) nicht ausgeführt, so sollte das testweise ja auch sein. Dennoch haut Windows nachwievor die Meldung raus, er könne die betreffende .HLP nicht finden. Der Mechanismus ist also trotz Abfangens nachwievor aktiv. Ich vermutete erst, die Geschichte liegt direkt in PreTranslateMessage() von CDialog, aber selbst wenn ich die letzte Zeile auskommentiere, erfolgt der Hinweis. Kann es sein, daß F1 irgendwie als Systemtaste agiert?

Ich werde noch irre mit diesem Problem, bei anderen Apps funktioniert das ja auch. Na ja, ein kleiner Codeschnippsel wäre sehr nett, denn im Inet habe ich zu dem Thema nicht sonderlich viel gefunden, was dieses Problem betrifft.
 
Wie schon Kachelator sagte:
Code:
if(pMsg->wParam == VK_F1)
{
   MessageBox(_T("F1 wurde gedrückt"));  // Bearbeitet  ..
   return TRUE;  // .. also nicht dispatchen
}
 
Dorado hat mir eben ne PN zugeschickt, die auch geklappt hat:

Einfach die WM_HELPINFO Message behandeln und nur TRUE zurückgeben. Datt war's...

Danke an alle für die Hilfe!
 

Neue Beiträge

Zurück