4

C++ で Windows API を使用しようとしましたが、正しいキー (キーの下の qwerty キーボードの右側にあるキー)SetWindowsHookEx WH_KEYBOARD_LLからイベントを取得していないようです。左キーで動作します。この問題をトラブルシューティングするにはどうすればよいですか???ShiftShiftEnterShift

#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;
}

右シフトは、アラートに白紙の文字列を示します。ただし、左シフトはアラートに「SHIFT」文字列を表示します。誰でも手がかりですか?

PS:

「 msg += ((st_hook.flags & LLKHF_EXTENDED) << 24);」の行を削除すると、-> 「RIGHT SHIFT」は表示されるようになりましたが、「Windows キー」を押すと undefined が表示されます

4

2 に答える 2

1

このソリューションは特定のコードに依存しません

if (st_hook.vkCode != VK_RSHIFT)
  msg += ((st_hook.flags & LLKHF_EXTENDED) << 24);
于 2015-03-02T06:17:21.207 に答える
1

左対右シフトは のvkCodeフィールドに表示されますKBDLLHOOKSTRUCT。スキャンコードのキーを使用しています。右シフト キーは、キーボードで言うように「Shift」という名前です。

どうやら、右シフトは拡張フラグ セットで終了し、GetKeyNameText が間違ったテーブルを参照するようになります。拡張フラグを削除すると、「右シフト」というキー名になります。

    msg += (st_hook.scanCode << 16);
    if (st_hook.scanCode != 0x3a)
    {
        msg += ((st_hook.flags & LLKHF_EXTENDED) << 24);
    }
    GetKeyNameText(msg, tmp, 0xFF);
于 2013-09-19T18:00:56.197 に答える