Zum Inhalt springen

Accelerator Table? Wie unterscheide ich.


Empfohlene Beiträge

Geschrieben

So, ich nochmal, gibet irgendeine möglichkeit, einen tastendruck abzufangen und dann zu unterscheiden, ob die rechte Entertaste oder die in der Mitte gedrückt wurde? Accelerator hilft mir da net so viel oder?

Geschrieben

Naja, also für die beiden Entertasten gibt es nur eine

Virtualkey-Konstante: VK_ENTER.

Deswegen kannst du für die beiden Tasten nicht

unterschiedliche Acceleratoen definieren.

Aber es gibt trotzdem eine Möglichkeit, zwischen den Tasten

zu unterscheiden :D, und zwar in der Fensterprozedur.

Du reagierst in der Fensterprozedur auf die Nachricht

WM_KEYDOWN. Dort überprüfst du, ob wParam == VK_ENTER. Wenn das der Fall ist, schaust du, ob im lParam das Flag KF_EXTENDED gesetzt ist. Ist auch dies der Fall, so handelt es sich um die "erweiterte" Enter-Taste, also die

im NumPad-Block.

Nochmal als Quellcode:


LRESULT WINAPI WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)

{

    switch (Msg)

    {

    //...

    case WM_KEYDOWN:

        if (wParam == VK_ENTER)

        {

            if (lParam & KF_EXTENDED)

                // Entertaste rechts unten gedrückt

            else

                // "normale" Entertaste gedrückt

        }

        break;

    //...

    }

    //...

}

Viel Spaß beim Werkeln!

Geschrieben

Demnach schreibst du das mit MFC?

Dann musst du mit dem Class Wizard für das entsprechende

Fenster einen Windows-Message Handler für das

WM_KEYDOWN-Ereignis erstellen, in dem du dann folgendes

tust:


void [i](OBJECT)[/i]::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 

{

    // TODO: Add your message handler code here and/or call default

    if ((nChar == VK_RETURN) && (nFlags & 0x100))

        // erweiterte Entertaste

    else

        // normale Entertaste

    [i](Vorige Instanz)[/i]::OnKeyDown(nChar, nRepCnt, nFlags);

}


Geschrieben

hmm, amazing.

Irgendwie tut der garnix. sicher das das flag 0x100 sein muß? Ich hab das jetzt genau so gemacht, ich mein, das kling ja auch einleuchtend. Ich habs zu sicherheit mal überall ausprobiert, aber selbst wenn ich in WM einen Haltepunkt setze und dann debugge komme ich nie dorthin.

:confused: :confused:

Geschrieben

Also, tach nochmal!

Ich hab mir jetzt mal den MFC-Sourcecode angeschaut,

die Nachricht WM_KEYDOWN mit wParam = VK_RETURN wird

vom Programmgerüst oft abgefangen.

Aber an der richtigen Stelle kann man trotzdem

unterscheiden :D, du musst nämlich die Methode

PreTranslateMessage(MSG* lpMsg) überschreiben,

dann klappts, z. B.:


BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) 

{

	// TODO: Add your specialized code here and/or call the base class

	if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)

	{

		if (pMsg->lParam & 0x01000000)

			AfxMessageBox("numpad enter tastendruck!");

		else 

			AfxMessageBox("normaler enter tastendruck!");

	}

	return CFrameWnd::PreTranslateMessage(pMsg);

}

Hab's nochmal ausprobiert, es funktioniert.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...