Archief - [PROG][VB.NET] KeyDown

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

sabaoth

Legacy Member
Ik ben een programmatje aan het maken en ik zou graag "sneltoetsen" toevoegen. Normaal gezien lukte mij dit altijd gewoon met de "KeyDown" handler. Wel dat lukt nog altijd, zolang er geen buttons of andere controls op mijn form staan :s Weet iemand mss hoe dit komt? :(

[AiR] LeViaTHaN

Legacy Member
Sneltoetsen kan je het beste doen door:
a) menuitems een shotcut te geven
b) mnemonics aan je labels toe te voegen
c) processcmdkey te overriden

sabaoth

Legacy Member
processcmdkey overriden werkt, bedankt :)
maar dat lukt alleen als er een knop wordt ingedurkt. Hoe kan ik bevoorbeeld
"ctrl + o" ofzo doen?
want
Code:
  If Keys.control and Keys.D Then
            MessageBox.Show("kadaboem")
   End If
werkt niet :s

[AiR] LeViaTHaN

Legacy Member
ProcessCmdKey wordt aangeroepen telkens er één knop ingedrukt wordt, hence the name ;)
Hoe je met meerdere knoppen werkt moet ik eens uitzoeken. Denk dat je het beste een aparte thread laat lopen die je toetsaanslagen verwerkt en er eventueel iets mee doet.

Ik post nog een voorbeeldje als ik het gevonden heb.

[AiR] LeViaTHaN

Legacy Member
Het blijkt toch wel moeilijker dan verwacht...
Om op je vraag terug te komen waarom de KeyDown event niet meer werkt als er controls op je form staan. Dit komt omdat in .NET het KeyDown event wordt opgevangen van de control waar de focus opstaat. Dus meestal is dit je eerste control op je form en als deze geen KeyDown event handler heeft dan zal er dus niets gebeuren.

Blijkbaar kan je het oplossen door de windows message op te vangen voordat deze naar de form gestuurd wordt.
Je doet dit door in je main volgende code te zetten.
Code:
Application.AddMessageFilter(<uw filter instantie>);

Die MessageFilter moet een klasse zijn die de IMessageFilter interface implementeert. Deze bestaat uit één method die de window message als parameter heeft. Hieruit kan je dus je pressed keys halen. Echter voor een combinatie van keys (zijnde jouw ctrl+o) is het me nog niet gelukt om deze te onderscheppen.

Ik ga hier nog wat verder met prutsen. Een (vuile) oplossing zou zijn: Zet al je shortcuts in een menu maar zorg ervoor dat je menuitems niet zichtbaar zijn voor de gebruiker. Dit werkt ook ;)

sabaoth

Legacy Member
Wow :p Maar het vreemde is, bij een paar mate die ik ken lukt het wel ... :s (met keydown of keyup) ook al hebbe ze andere controls op hun form staan :s

[AiR] LeViaTHaN

Legacy Member
Bij mij met .NET 2.0 wordt mijn KeyDown event op de form ook niet meer gefired als ik er een andere control heb opstaan. Ik ga hier de mening van enkele knappe koppen op het werk vragen, er zal wel iemand zijn die een goede oplossing hiervoor heeft ;)

sabaoth

Legacy Member
ghi, ik zou het eigelijk wel moette vinden tege deze avond :p Maar ik denk dat ik dan gewoon de F toetse ga gebruiken :) toch bedankt !

Ice

Legacy Member
goh, heb hier niet direct iets van .Net geinstalleerd staan maar:
To handle keyboard events only at the form level and not allow other controls to receive keyboard events, set the KeyPressEventArgs.Handled property in your form's KeyPress event-handling method to true. Certain keys, such as the TAB, RETURN, ESCAPE, and arrow keys are handled by controls automatically. In order to have these keys raise the KeyDown event, you must override the IsInputKey method in each control on your form. The code for the override of IsInputKey would need to determine if one of the special keys is pressed and return a value of true.
+ het feit dat het KeyDown event speciale methodes heeft om te checken of ctrl / alt of shift is ingedrukt

En dan zou ik zo denken dat je adhv een keydown event gewoon kunt vragen:
isAlt and keyCode = O
(of mis ik hier iets?)
bron

sabaoth

Legacy Member
Snap em nie :p Maar ik heb het met de "vuile" oplossing van leviathan gedaan :)

Ice

Legacy Member
sabaoth zei:
Snap em nie :p Maar ik heb het met de "vuile" oplossing van leviathan gedaan :)

ok dus nu werkt het vuil, dus hebt ge alle tijd om een propere oplossing te zoeken ;) (of te leren begrijpen)

Yank

Legacy Member
sabaoth zei:
Ik ben een programmatje aan het maken en ik zou graag "sneltoetsen" toevoegen. Normaal gezien lukte mij dit altijd gewoon met de "KeyDown" handler. Wel dat lukt nog altijd, zolang er geen buttons of andere controls op mijn form staan :s Weet iemand mss hoe dit komt? :(
staat bij eigenschappen van form de keypreview op true?

sabaoth

Legacy Member
ok, da was vrij dom :p Dankuwel Yankee :) Toch begrijp ik ni waarom dat da bij vriende van mij dan automatisch op stond. Achja dan wete we dat voor de volgende keer :D

[AiR] LeViaTHaN

Legacy Member
KeyPreview op true zetten heeft blijkbaar een vervelende bijwerking. Stel je hebt een keydown event dat een key down (pijltje naar beneden) moet opvangen en iets doen en je hebt een listbox, datagrid control of iets dergelijks dan wordt je key down in die control eerst opgevangen door het keydown event van je form. Wat soms vervelend kan zijn.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan