Создание моей собственной переменной LPARAM - PullRequest
1 голос
/ 21 июля 2011

Я хочу создать свой собственный LPARAM для передачи в win32-функцию GetKeyNameText (), (первый параметр принимает переменную LPARAM).

Может показаться, что делать что-то нелегко, но это работаиз-за того, что у меня нет определенного количества информации, а также работа на уровне битов, ДЕЙСТВИТЕЛЬНО сбивает меня с толку, поэтому я хочу ознакомиться с этим.

Итак, что я хочу добавить в мою переменную LPARAM:установить 16-23 бита для клавиатуры. Код сканирования: у меня есть код сканирования, я просто не знаю, как бы я скомбинировал его в 32-битную переменную?- установить 24-й бит в флаг расширенного ключа (я пока не знаю, как получить это, пока как в одиночку, как объединить его в 32-битную переменную) - установить 25-й бит в бит безразличия, чтобы мне было все равно - так бы яустановите этот бит на 1?

Так что я понимаю, как работают двоичные файлы и биты ... Я думаю, это поразительно, я понимаю понятия более высокого уровня lvl, такие как полиморфизм, но не низкоуровневое компьютерное оборудование: P

Итак, у меня есть 32-битная (или байтовая?) Переменная, значит ли это, что у меня есть 32 0 и 1: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ИЛИ У меня есть переменная, такая как XXXXXX, например, 100011 (что составляет 35), где последнее число равно 2 ^ 0(так 1), затем 2 ^ 1 (2), затем 2 ^ 2 (4), .... затем, наконец, 2 ^ 5 (32).

Итак, чтобы создать свой LPARAM, я бы сделал это:

DWORD scanCode = 0x??;  // a DWORD is a 32bit var, but the scan code is only 7 bits long?
bit   extFlag       = 1;        // now is there a bit variable? How can I find out the extended-key flag also?
bit   careBit       = 1;       

//Now to combine it all would I do this? 
DWORD myLParam = scanCode & extFlag & careBit;
// OR
LPARAM myLParam = scanCode & extFlag & careBit;

Ответы [ 2 ]

3 голосов
/ 21 июля 2011

Я думаю, что лучший способ сделать это - использовать битовые поля (http://msdn.microsoft.com/en-us/library/ewwyfdbe%28v=vs.80%29.aspx)

Вот структура, которую я использую для получения состояния ключа из LPARAM:

union KeyState
{
    LPARAM lparam;

    struct
    {
        unsigned nRepeatCount : 16;
        unsigned nScanCode : 8;
        unsigned nExtended : 1;
        unsigned nReserved : 4;
        unsigned nContext : 1;
        unsigned nPrev : 1;
        unsigned nTrans : 1;
    };
};

Тогда вы бы реализовали это просто:

KeyState keyState; // declared globally
case WM_KEYDOWN:
{
    keyState.lparam = lparam;

    // Use values here, e.g:
    printf("%d,%d,%d", keyState.nRepeatCount, keyState.nScanCode, keyState.nExtended);

    return 0;
}
0 голосов
/ 21 июля 2011

Попробуйте:

char keyName[100];
int scanCode   = ????;
bool extended  = ????;
bool dontcare  = ????;

int retval = GetKeyNameText(
    (scanCode & 0xFF) << 16 | (LPARAM)extended << 24 | (LPARAM)dontcare << 25,
    keyName, sizeof(keyName));
printf("%s\n", keyName);

Теперь вам нужно решить (вы можете поэкспериментировать или прочитать документацию ), какие значения вы хотите задать для scanCode, extended и dontcare,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...