Avatar billede biohazard_666 Nybegynder
29. december 2007 - 14:24 Der er 1 løsning

Problemer med PostMessage med ALT, SHIFT osv.

Hej eksperter :)

Jeg er ved at udvikle et program der ved brug af PostMessages styrer et andet program. Problemet er dog, at jeg kun kan sende normalt bogstaver og tallene 0-9 som de er. Hvis jeg fx vil holde ALT nede imens, så der egentlig skal sendes ALT+5, så genkender programmet kun '5', og ignorerer ALT. Jeg har læst noget om, at det er pga. en speciel "state" som skal angives før at ALT registreres som nede. Ellers har jeg, når jeg sender tallet 1 til programmet, fundet følgende koder vha. Spy++: (indsat i VB-konstanter)

Const VK_KEY1 = &H31
Const VK_KEY1L = &H20001
Const VK_KEYUP1 = &H31
Const VK_KEYUP1L = &HC0020001

---

PostMessage hWnd, WM_KEYDOWN, VK_KEY1, VK_KEY1L
PostMessage hWnd, WM_CHAR, VK_KEY1, VK_KEY1L
PostMessage hWnd, WM_KEYUP, VK_KEYUP1, VK_KEYUP1L

Når jeg så læser i Spy++ efter at have trykket ALT+1, skal jeg umiddelbart skrive følgende: (også i VB-konstanter)

Const VK_ALT = &H12
Const VK_ALTL = &H20380001
Const VK_ALTUP = &H12
Const VK_ALTUPL = &HC0380001

Const VK_aKEY1 = &H31
Const VK_aKEY1L = &H20020001
Const VK_aKEYUP1 = &H31
Const VK_aKEYUP1L = &HE0020001

---

    PostMessage hWnd, WM_SYSKEYDOWN, VK_ALT, VK_ALTL
    PostMessage hWnd, WM_SYSKEYDOWN, VK_aKEY1, VK_aKEY1L
    PostMessage hWnd, WM_SYSCHAR, VK_aKEY1, VK_aKEY1L
    PostMessage hWnd, WM_SYSKEYUP, VK_aKEYUP1, VK_aKEYUP1L
    PostMessage hWnd, WM_KEYUP, VK_ALTUP, VK_ALTUPL


Dette virker dog ikke, og der sker det samme, som hvis jeg bare sendte et tastetryk på 1. Jeg har også læst noget om, at API'en SendInput kan generere et sådan "fake" ALT-tryk, men har ikke kunnet finde nogle umiddelbare koder til at se hvordan dette kan gøres :/

Hvis der er nogen, som kan hjælpe med denne problemstilling, vil jeg blive meget glad, da dette har plaget mig i en hel del tid efterhånden :)
Avatar billede biohazard_666 Nybegynder
30. december 2007 - 12:25 #1
Jeg fandt sQ svaret på spørgsmålet :)

Koden jeg brugte er denne:
    Public Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

    Public Const KEYEVENTF_EXTENDEDKEY = &H1
    Public Const KEYEVENTF_KEYUP = &H2
    Public Const VK_SHIFT = &H10
    Public Const VK_CONTROL = &H11
    Public Const VK_ALT = &H12


For så at bruge koden, til fx at trykke CTRL+1:
    Call keybd_event(VK_CONTROL, 0, 0, 0)
    PostMessage DAoChWnd, WM_KEYDOWN, VK_KEY1, VK_KEY1L
    PostMessage DAoChWnd, WM_CHAR, VK_KEY1, VK_KEY1L
    PostMessage DAoChWnd, WM_KEYUP, VK_KEYUP1, VK_KEYUP1L
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