2010-02-15 2 views
2

В настоящее время я определяю позицию x и y щелчка мыши, сохраняя его в Точка и отображая его через окно сообщения.Расширение события щелчка мыши - C

Я хочу, чтобы иметь возможность читать, если удерживается другая клавиша клавиатуры, например, клавиша Shift или Control.

Глядя на MSDN я нашел следующую информацию:

WPARAM Указывает различные виртуальные клавиши вниз. Этот параметр может быть одним или несколькими из следующих значений .

MK_CONTROL Клавиша CTRL не работает.

MK_MBUTTON Средняя кнопка мыши down.

MK_RBUTTON Правая кнопка мыши down.

MK_SHIFT Клавиша SHIFT не работает.

MK_XBUTTON1 Windows 2000/XP: первая кнопка X не работает.

MK_XBUTTON2 Windows 2000/XP: кнопка вторая кнопка X не работает.

Проблема, с которой я столкнулся, заключается в том, что я не уверен, как хранить результаты из wParam для каждого параметра и использовать их, как я должен отображать их через окно сообщения.

Вот мой прогресс до сих пор:

LRESULT CALLBACK WindowFunc(HWND hMainWindow, UINT message, 
    WPARAM wParam, LPARAM lParam) 
{ 
POINTS mouseXY; 
WCHAR buffer[256]; 

    // Act on current message 
    switch(message)  
    { 
    case WM_DESTROY: 
     PostQuitMessage(0); 
     break; 
case WM_LBUTTONUP: 
    // Get mouse x, y 
    mouseXY = MAKEPOINTS(lParam); 

    // Output the co-ordinates 
    swprintf(buffer, 255, L"x = %d, y = %d", mouseXY.x, mouseXY.y); 
    MessageBox(0, buffer, L"Mouse Position", MB_OK); 
    break; 
    default: 
     return DefWindowProc(hMainWindow, message, wParam, lParam); 
    } 
    return 0; 
} 

Спасибо за помощь

ответ

1

различные виртуальные клавиши ORed вместе в wParam. Чтобы проверить одиночные значения, вы должны И их (подумайте об основных битовых операциях).

Пример:

swprintf(buffer, 255, L"x = %d, y = %d, Shift = %s, Ctrl = %s", 
     mouseXY.x, mouseXY.y, 
     wParam & MK_SHIFT ? L"yes" : L"no", 
     wParam & MK_CONTROL ? L"yes" : L"no"); 
+0

Прекрасно работает, должен был добавить L перед каждым «да» и «нет», чтобы получить правильный результат. Спасибо. –

+0

Добро пожаловать. И ты прав, я забыл Ls. Я добавил их в свой ответ. – gclj5

1

Вы можете использовать GetAsyncKeyState, чтобы узнать состояние большинства кнопок:

SHORT lshift = GetAsyncKeyState(VK_LSHIFT); 
SHORT rshift = GetAsyncKeyState(VK_RSHIFT); 
// etc... 

Here это описание различия между GetKeyState и GetAsyncKeyState.

Вы также можете использовать GetKeyboardState:

BYTE keyboardState[256]; 
GetKeyboardState(keyboardState); 
+0

Спасибо за объяснение. –

Смежные вопросы