SetWindowsHookEx WH_KEYBOARD_LL not responding on right shift

I try to use the Windows API in c++ and `SetWindowsHookEx` `WH_KEYBOARD_LL` does not seem to get events from the right <kbd>Shift</kbd> key (the <kbd>Shift</kbd> key at the right side of a qwerty keyboard, below the <kbd>Enter</kbd> key). It does work with the left <kbd>Shift</kbd> key. How do I troubleshoot this problem???
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
    #include "stdafx.h"
    #include <cstdlib>
    #include <fstream>
    #include <iostream>
    #include <string>
    #include <windows.h>
    #include <string> 
    #include <shlobj.h>
    #include <Shlwapi.h>
    #include <stdio.h>
    #include <aclapi.h>
    #include <tchar.h>
    #include <iostream>
    #include <fstream>
    #include <future>
    #include <stdlib.h>
    #include <random>
    #include <ctime>
    #include <time.h>       
    #include <Lmcons.h>
    
    
    
    HHOOK   kbdhook;    /* Keyboard hook handle */
    bool    running;    /* Used in main loop */
    
    
    __declspec(dllexport) LRESULT CALLBACK handlekeys(int code, WPARAM wp, LPARAM lp)
    {
    		static bool capslock = false;
            static bool shift = false;
            char tmp[0xFF] = {0};
            std::string str;
            DWORD msg = 1;
            KBDLLHOOKSTRUCT st_hook = *((KBDLLHOOKSTRUCT*)lp);
    
    			
    
    		msg += (st_hook.scanCode << 16);
            msg += ((st_hook.flags & LLKHF_EXTENDED) << 24);
            GetKeyNameText(msg, tmp, 0xFF);
            str = std::string(tmp);
    
    
        if (code == HC_ACTION && (wp == WM_SYSKEYDOWN || wp == WM_KEYDOWN )) {
    		MessageBox(NULL,str.c_str(),NULL,MB_OK);
    }
    return CallNextHookEx(kbdhook, code, wp, lp);
    }
    
    LRESULT CALLBACK windowprocedure(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
    {
        switch (msg) {
            case WM_CLOSE: case WM_DESTROY:
                running = false;
                break;
            default:
                /* Call default message handler */
                return DefWindowProc(hwnd, msg, wp, lp);
        }
    
        return 0;
    }
    
    int WINAPI WinMain(HINSTANCE thisinstance, HINSTANCE previnstance,
            LPSTR cmdline, int ncmdshow)
    {
    
    
        HWND        hwnd;
        HWND        fgwindow = GetForegroundWindow(); 
        MSG     msg;
        WNDCLASSEX  windowclass;
        HINSTANCE   modulehandle;
    
        modulehandle = GetModuleHandle(NULL);
        kbdhook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)handlekeys, modulehandle, NULL);
        running = true;
    
    
    
    
    
    
        while (running) {
    
            if (!GetMessage(&msg, NULL, 0, 0))
                running = false; 
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    
        return 0;
    }

Right shift shows a blanco string in the alert. Left shift however shows a "SHIFT" string in the alert.
Last edited on
Topic archived. No new replies allowed.