Avatar billede spectual Nybegynder
30. april 2001 - 02:26 Der er 28 kommentarer og
1 løsning

Trække virtual keycode ud af message

Jeg har en procedure, som modtager keyboard messages. Hvorledes trækker jeg den \"virtual keycode\" ud af beskeden? (dvs. ud af lparam).
Avatar billede ziron Nybegynder
30. april 2001 - 02:32 #1
jeg tror ikke jeg er helt med på hvad du vil???

/ZIRON
Avatar billede spectual Nybegynder
30. april 2001 - 02:44 #2
Hvis du skriver tmessage i et delphi program og med cursoren på ordet trykker f1 får du en defination af tmessage.

I denne defination er en parameter, lparam.

Når en program modtager sådan en message, som fortæller at der er trykket på en tast, vil lparam indeholde tasten \"virtuelle\" værdi.

Den virtuelle værdi, også kaldet virtual keycode, vil jeg gerne isolere (f.eks. via. en AND) ud af lparam.

Der står i hjælpen, at det er bit 16 til 23, der indeholder denne værdi.

Jeg skal have konstrueret en sætning, der kopierer disse bits ud af værdien til en ny variabel, således at jeg ikke får andre dele af lparam med end det jeg skal bruge.
Avatar billede ziron Nybegynder
30. april 2001 - 02:57 #3
hmmm jeg tror du skal vente til nogle af delphi hovederne kommer på banen :-)

/ZIRON
Avatar billede borrisholt Novice
30. april 2001 - 04:45 #4
Lad mig lige slå fast det er den Virtuele ScanCode du har i din lParam og ikke den Virtuele key. Sidstnævnte finder du i wParam.

Any way så er dit i den høje del af dit lParam der er intressant. Prøv det her :

if (HiWord(lParam) and KF_UP) <> 0) then
begin
  //do Stuff
 
end;

Jens B
Avatar billede spectual Nybegynder
30. april 2001 - 09:18 #5
Ok. Hvilken værdi vil du mene er mest interessant når jeg skal finde ud af hvilken tast brugeren trykker på?
Avatar billede borrisholt Novice
30. april 2001 - 09:42 #6
Jeg må fomode du har gang i et KeyBoard hook.....

Som jeg skrev (i morges) så scan koden ligge som den høje del af dit lParam.

I den lave del af dit wParam finder du den Virtuelle key Altså :

if Lo(wParam) = VK_RETURN then
  ShowMessage(\'Enter\');

Avatar billede spectual Nybegynder
30. april 2001 - 09:58 #7
Kan du forklare forskellen på virtual scancode og virtual key?
Avatar billede borrisholt Novice
30. april 2001 - 10:10 #8
jammen dine scan kodet siger noget om noget fysisk, fx. er tasten på vej op eller på vej ned. Er det højre eller venstre shift taste. Etc. Hvorimod en virtual key er en integer der repræsenterer den tast der er trykket ned.

Hvis kigger på et onKeyDownEvent :


procedure TForm1.ButtonGoKeyDown(Sender: TObject; var Key: Word;  Shift: TShiftState);
begin

end;

Så Sender er Det objekt der kaldte funktionen (Surprise)
key : Er din Virdual key. VK_RETURN, VK_A etc.
Shift bliver til ud fra din Scancode, dog kan du ikke i den (Shift: TShiftState) skelne mellem de to ShiftTaster .....

Hele eventet er også blevet til i en Keyboard hook, hvor det før viste check er blevet lavet :

if (HiWord(lParam) and KF_DOWN) <> 0) then
begin
  //Kald til OnKeyDown(); 
end;

Jens B
Avatar billede spectual Nybegynder
30. april 2001 - 10:17 #9
Det, jeg er i gang med, er at lave en \"hotkey\" funktionalitet til et program. På et tidspunkt, får jeg brug for at brugeren kan vælge den hotkey. Derfor er jeg programmeringsmæssigt ligeglad med hvilken tast der trykkes på, så for at gøre det nemmest, ønsker jeg sådan set bare en tal værdi for tasten og om den er trykket eller sluppet. Det kan jeg vel ikke få fra via. hiword (lparam) fordi at skankoden ligger i bits 16-23 ?
De højere bits indeholder jo info. om blandt andet om tasten er extended og om den er trykket ned, gentrykket eller sluppet. Jeg skal vel bare egentlig kopiere bits 16-23 ud af lparam og så har jeg en værdi for tasten, eller hvad mener du?
Avatar billede borrisholt Novice
30. april 2001 - 10:26 #10
Jammen så stille du jo de forkerte spørgsmål .. Så skal du jo spørge om hvordan man laver sådan en hotkey fætter.

Jens B
Avatar billede borrisholt Novice
30. april 2001 - 10:27 #11
Held mig lige en mail så sender jeg et eksempel.

Jens B
Avatar billede spectual Nybegynder
30. april 2001 - 10:29 #12
klpe@aabc.dk

Jeg håber at du forstår hvad jeg er ved at lave.... :-)
Avatar billede spectual Nybegynder
30. april 2001 - 10:34 #13
Tak for det. Jeg kigger på det i aften.
Avatar billede borrisholt Novice
01. maj 2001 - 14:21 #14
Virkede det spectual ?

Jens B http://fotx.net/borrisholt
Avatar billede spectual Nybegynder
01. maj 2001 - 14:23 #15
eh... jeg fik ikke lige kigget på det :P

I aften har jeg ikke tid... må prøve at gøre det i morgen eller så\'n.
Avatar billede spectual Nybegynder
03. maj 2001 - 10:41 #16
Nu har jeg kigget på det, men jeg tror ikke rigtigt kan bruge det til mit projekt.

Hvis jeg tager wparam fra keyboard message\'n får jeg jo \"virtual keycode\", hvilket er nogenlunde godt. Desværre skelnes der ikke imellem f.eks. venstre shift og højre shift.

Hvordan opnår jeg det? :\\
Avatar billede borrisholt Novice
03. maj 2001 - 10:50 #17
spectual>> Selvfølgelig skelnes der mellem højre og venstre Shift tast.....

Jeg forstår det stadig ikke.

Det du ønsker er når brugeren trykker en bestemt HOTKEY på et eller ander tidspunkt, skal dit program have focus, samt kalde noget kode ?

Jens B
Avatar billede spectual Nybegynder
03. maj 2001 - 10:54 #18
Ja, det er det jeg gerne vil opnå.

Jeg gør det iøjeblikket med et keyboard hook. Her modtager hovedprogrammet Windows keyboard messages, som den kigger på for at afgøre om en tast er trykket.
Avatar billede borrisholt Novice
03. maj 2001 - 10:56 #19
Det er NØJAGTIGT det det program jeg sendte dig kunne ....

Jéns B
Avatar billede spectual Nybegynder
03. maj 2001 - 11:01 #20
mmm okay Jens B. :) Så kigger jeg lige på det igen. Hvordan sætter jeg hvilken tast, der skal være hotkey?
Avatar billede borrisholt Novice
03. maj 2001 - 11:09 #21
På komponentet er der en property der hedder Key. Den sætter du.

key er af typen TShortcut.

Du kan konvetere den til og fra en Streng med funktionerne :
ShortCutToText og TextToShortCut

Endvidere findes der på Fanen Win32 en variant af en TEdit der kan bruges til HotKeys .

Jens B
Avatar billede spectual Nybegynder
03. maj 2001 - 11:12 #22
Jeg mener bare ikke at mindes at de skelner forskel på venstre/højre shifttast og venstre/højre alt-tast.
Avatar billede borrisholt Novice
03. maj 2001 - 11:15 #23
Det gør der heller ikke. Men start nu med at få det alm. til at virke. Så skal jeg senere vise dig hvordan du piller det ud af en KeyboardMessage ....


Altså forsæt som om du var ligeglad .... så kommer vi rundt til resten senere ....

Jens B
Avatar billede spectual Nybegynder
03. maj 2001 - 11:20 #24
det gør jeg :)
Avatar billede spectual Nybegynder
10. maj 2001 - 09:15 #25
bare rolig borrisholt - spørgsmålet er ikke glemt, men jeg har i tiden ikke rigtig tid til at prøve det af.
Avatar billede spectual Nybegynder
18. maj 2001 - 14:45 #26
Jeg har fået prøvet det af nu og man må sige det er ret problemfrit at brug det.

Kan man ikke have flere hotkeys?
Avatar billede borrisholt Novice
18. maj 2001 - 14:49 #27
du kan bare sætte to komponener på...

Jens B
Avatar billede spectual Nybegynder
18. maj 2001 - 14:52 #28
jeg prøvede men jeg synes ikke at det virker. Det er også lige meget - det er vigtigere at der skelnes mellem venstre og højre shift, ctrl og alt tasterne.
Avatar billede spectual Nybegynder
31. maj 2001 - 10:49 #29
Nå... Det er da også ved at være gammelt det her spørgsmål. Lige for en opsumerings skyld, her er lige hvad der sket siden sidst:

Jeg prøvede at inplementere din hotkey i programmet men det endte med at jeg fjernede den igen fordi jeg ikke var helt tilfreds med hvordan den virkede til formålet.

Jeg har dog imidlertid fundet et lille stykke kode, der hiver scankoden ud af en keyboardmessage, men tilsyneladende giver det ingen forskel på venstre og højre alt.

Det kan være det ender med at jeg bruger din komponent, men sandsynligvis bruger jeg nok mine hook rutiner.

Men du har da mere end rigeligt fortjent pointene og jeg takker for hjælpen :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester