[gelöst] Kein ALT für wxMenuBar



  • Hallo,
    Ich habe eine wxMenuBar in meinem Programm und müsste dringend abstellen, dass sich das Menü aktiviert wenn ich die ALT-Taste drücke. (wie in Windows halt normal...)
    Ich habe versucht ein

    EVT_KEY_DOWN(FirstFrame::OnKeyDown)
    

    einzurichten und dann mit

    void FirstFrame::OnKeyDown(wxKeyEvent &event)
    {
      if (!event.AltDown())
      {
        event.Skip();
      }
    }
    

    allerdings klappt das leider nicht.
    Bitte um Hilfe,
    Danke,
    Stefan



  • Ich weiss es nicht 100%, aber das wirst du nicht ohne weiteres verhindern können, da die Abfrage in der Lib stattfindet bzw wenns nicht sogar von Windows so vorgegeben ist.
    Gegenfrage: WARUM willst du das?
    Dass sich mit ALT das Menü aktiviert, ist, wie du schon gemerkt hast, ein Standardverhalten von Windows. Man sollte immer vermeiden solches Verhalten mit Gewalt zu ändern, da User sich daran gewöhnen. Das nächste ist die Accessibility, die wird dadurch stark eingeschränkt, da der User nicht mit der Tastatur ins Menü kommt. Für einarmige nicht gerade toll.
    rya.



  • Hallo,
    die alte Frage nach Sinn und Unsinn ist hier absolut berechtigt, das sehe ich ein.

    Ich schreibe ein Programm für Alleinunterhalter. Das Prinzip ist eine Begleitautomatik die wesentlich klüger ist als das was ein "normales" Keyboard zu leisten vermag, da ich mit Schemen, Musiktheorie und dynamischer Rhytmik arbeite und nicht mit einer art Notenlinie die nur durch die Tonarten geschoben wird, wie das bei Keyboard oft üblich ist. Mein Ziel ist es eine Begleitautomatik zu schreiben die klingt wie eine Band, und nicht wie eine Begleitautomatik.

    Die Eingabe der Noten soll einmal über das Midi-Keyboard erzeugt werden (RtMidi ist das sehr zu empfehlen) und auch per Tastatur. Um dem Programm sagen zu können, welcher Akkord derzeit gespielt werden soll benötige ich Tastenkombinationen die schnell gehen (also Shortcuts).

    Beispiel:
    Taste C: C-Dur
    Tasten SHIFT-C: C#-Dur
    Tasten STRG-C: C-Moll
    Tasten ALT-C: Csus4
    Tasten ALT-SHIFT-C: C#sus4

    Damit habe ich die wichtigsten Fälle abgedeckt, die ein Alleinunterhalter brauchen könnte wenn er gerade kein Midi-Keyboard angesteckt hat um z.B. seine Lieder zu programmieren und testen zu können.

    Wenn ich jetzt versehentlich die STRG-Taste drücke und loslassen passiert nichts. Wenn ich auf das C drücke, dann wird normal mein C-Dur ausgelöst.

    Wenn ich versehentlich auf Alt drücke und loslasse, dann aktiviere ich das Menü. Wenn ich dann auf das C drücke passiert nichts, weil das Menü aktiv ist und das Menü das Key-Event abfängt.

    Das ist ein Problem, weil die Steuerung dann nicht mehr macht was Sie tun soll. Ich bekomme dann keinen Akkordwechsel und folglich spielt der Automat den alten "falschen" Akkord weiter.

    Ich weiß nicht ob du Musiker bist und mir folgen kannst, Fakt ist aber: Alle wichtigen Befehle werden bei mir über Kurztasten und Tastenkombinationen aufgerufen. Programm beenden hat z.B. die Kurztaste NUM-"112" (1 - Hauptmenü, 1 - Programmsteuerung, 2 - Programm beenden), so dass ich jeden Menüpunkt über schnelle Tastenkombinationen am Num-Block (oder für Laptops mit STRG-Zahl) aufrufen kann. Folglich muss ich mit der Alt-Taste nicht ins Menü, weil das auch über die Taste NUM-0 aktiviere. (Das geht auch schon super)



  • Also zuerst würde ich dir gerne wxKeybinder empfehlen: http://wxcode.sourceforge.net/components/keybinder/.
    Damit lassen sich auch Profile erstellen.

    Ein möglicher Workaround wäre auch, das Menü während des Spielens einfach zu deaktivieren. Denn dann brauchst du das ja nicht. Man könnte es dann mit einem rechtsklick einblendbar machen.
    Das fällt mir dazu ein. Ansonsten poste doch das Problem noch in wxforum.shado.net. Da sind jede Menge wxGurus unterwegs.
    Ich kann da momentan leider nicht weiterhelfen.
    rya.



  • Danke für die Tipps.
    Beim Spielen brauch ich das Menü leider schon, weil darüber z.B. von 4/4-Takt auf 3/4-Takt umgeschalten wird, etc.
    Das Menü zu deaktivieren klappt leider nicht, weil ich mit der ALT-Taste dann in das Icon-Menü komme (also das Menü oben Links beim Icon, z.B. Wiederherstellen, Verschieben, Größe ändern, etc...)
    Ansonsten hab ich es so gelösst, dass wenn ich eine Alt-Taste habe, ein Timer anläuft, der - wenn nichts anderes gedrückt wird - nach 2 Sekunden nochmal ne ALT-Taste losschickt und somit das Menü wieder deaktiviert. Ist ein Notnagel und ich suche noch nach einer super Lösung, aber fürs erste mal ausreichend.



  • Noch kurz zur Info. Die Taste F10 aktiviert das Menü ebenfalls. Das ist eine Eigenheit von Windows, nicht von wxWidgets. Also lässt sich das über wxWidgets nicht abgewöhnen. Mann muss direkt mit der MFC ein Menü erzeugen und dort die Eigenschaften abdrehen. Dieses Menü muss man dann an wxWidgets übergeben. Ich hab viele Theorien gefunden, aber kein Tutorial oder was anderes brauchbares. Fakt ist: Man muss wx aufbohren ohne Ende um das Menü ins wxWidgets zu bekommen oder direkt mit der MFC arbeiten.

    Also werde ich mir wohl etwas anderes einfallen lassen müssen.
    Somit gebe ich den Thread als gelöst an.



  • stefanjann schrieb:

    Noch kurz zur Info. Die Taste F10 aktiviert das Menü ebenfalls. Das ist eine Eigenheit von Windows, nicht von wxWidgets. Also lässt sich das über wxWidgets nicht abgewöhnen. Mann muss direkt mit der MFC ein Menü erzeugen und dort die Eigenschaften abdrehen. Dieses Menü muss man dann an wxWidgets übergeben. Ich hab viele Theorien gefunden, aber kein Tutorial oder was anderes brauchbares. Fakt ist: Man muss wx aufbohren ohne Ende um das Menü ins wxWidgets zu bekommen oder direkt mit der MFC arbeiten.

    Also werde ich mir wohl etwas anderes einfallen lassen müssen.
    Somit gebe ich den Thread als gelöst an.

    Naja, man könnte die Event-Queue von wxWidgets evtl. hacken, wenn sich das über die Windows-Events abstellen lässt. Das vllt als Denkansatz. Da müsste man mal im WINAPI-Forum nachfragen. Das könnte man dann als Option in die Klasse einbauen (und evtl. dann auch den Devs als Patch anbieten).

    Quer gedacht: DirectInput im Exclusive Mode? Reagiert da das Menü immer noch?

    rya.



  • http://social.msdn.microsoft.com/forums/en-US/winforms/thread/016576aa-e9dd-435e-bf5d-92c358eb6983/
    Hier steht wie man den Context-Menu-Button abfängt, das wäre als Tastenbelegung eine alternative.

    Noch eine Alternative:
    Registrier doch Alt-C, Alt-D etc als globalen Hotkey. Nachteil: Diese Tasten dürfen nicht bereits als HOtkey aktiviert sein auf dem jeweiligen OS. HIer käme aber wieder der Keybinder ins Geschäft, wo man das ändern kann^^.
    rya.



  • Danke für deine Ideen. Ich werde bei Zeiten versuchen das zu machen. Momentan suche ich noch im Quellcode von wxWidgets nach den passenden Stellen. Ist - wenn man das das erste Mal macht - nicht gerade einfach sich darin zurecht zu finden. Aber die Idee finde ich super. Mal schauen ob ich es schaffe, aber wahrscheinlich bin nich noch zu sehr Newbe(e).


Anmelden zum Antworten