PDA

Просмотр полной версии : Как поймать событие VK_SHIFT если он нажался в комбинации с другой клавишей?


Ya Zaregalsya
09.06.2022, 20:26
Хочу поймать VK_SHIFT в хуке WndProc, но как я понимаю в комбинации с другой клавишей, например шифт+1 сгенерирует событие восклицательного знака, а не шифта или единицы. Есть ли способ именно в WndProc узнать, что был нажат именно VK_SHIFT даже если они был нажат в комбинации с другой клавишей?

uqowivad
03.02.2023, 08:09
Этот код сначала проверяет, нажата ли клавиша VK_SHIFT

Затем проверяет параметр wParam, чтобы узнать, какая другая клавиша была нажата в сочетании с VK_SHIFT.

c++:






LRESULT CALLBACK
WndProc
(
HWND hWnd
,
UINT message
,
WPARAM wParam
,
LPARAM lParam
)
{
if
(
message
==
WM_KEYDOWN
)
{
if
(
GetKeyState
(
VK_SHIFT
)
&
0x8000
)
{
// VK_SHIFT Only
if
(
wParam
==
'1'
)
{
// VK_SHIFT + 1
}
else
if
(
wParam
==
'2'
)
{
// VK_SHIFT + 2
}
// code
}
}
// code
}

Ya Zaregalsya
03.02.2023, 10:41
Этот код сначала проверяет, нажата ли клавиша VK_SHIFT
Затем проверяет параметр wParam, чтобы узнать, какая другая клавиша была нажата в сочетании с VK_SHIFT.

c++:






LRESULT CALLBACK
WndProc
(
HWND hWnd
,
UINT message
,
WPARAM wParam
,
LPARAM lParam
)
{
if
(
message
==
WM_KEYDOWN
)
{
if
(
GetKeyState
(
VK_SHIFT
)
&
0x8000
)
{
// VK_SHIFT Only
if
(
wParam
==
'1'
)
{
// VK_SHIFT + 1
}
else
if
(
wParam
==
'2'
)
{
// VK_SHIFT + 2
}
// code
}
}
// code
}





Проверял? На сколько мне подсказывает память там будет восклицательный знак, а не единичка.

uqowivad
03.02.2023, 13:02
Проверял? На сколько мне подсказывает память там будет восклицательный знак, а не единичка.


Только что проверил - действительно выводит 1

Ya Zaregalsya
03.02.2023, 14:52
Только что проверил - действительно выводит 1


Так, вопрос старенький, чёто туплю. Суть вопроса был в чём, как поймать событие вк шифт если при этом нажаты другие клавиши. Т.е. нужен именно ВК ШИФТ, а не единички или восклицательные знаки, и желательно поймать его в кач-ве события, проблема в том, что в комбинации с цифрами это уже будет не ВК_ШИФТ, а соответствующий символ !"№;%:?*()_+. Костыльное решение проблемы это юзать функи по типу GetKeyState или IsKeyJustPressed в СФ, как я собстно и сделал, но красивее и надёжнее это было бы реализовать именно событием, чтобы ловить как нажатие, так и отжатие шифта.

Musaigen
03.02.2023, 15:01
Так, вопрос старенький, чёто туплю. Суть вопроса был в чём, как поймать событие вк шифт если при этом нажаты другие клавиши. Т.е. нужен именно ВК ШИФТ, а не единички или восклицательные знаки, и желательно поймать его в кач-ве события, проблема в том, что в комбинации с цифрами это уже будет не ВК_ШИФТ, а соответствующий символ !"№;%:?*()_+. Костыльное решение проблемы это юзать функи по типу GetKeyState или IsKeyJustPressed в СФ, как я собстно и сделал, но красивее и надёжнее это было бы реализовать именно событием, чтобы ловить как нажатие, так и отжатие шифта.



mod_sa/src/keyhook.cpp at dc9b3b13599a8b6325e566f567b5391b0b2a6dc8 · BlastHackNet/mod_sa (https://github.com/BlastHackNet/mod_s0beit_sa-1/blob/dc9b3b13599a8b6325e566f567b5391b0b2a6dc8/src/keyhook.cpp#L52)

Multi-purpose cheat tool for GTA San Andreas and SA-MP - BlastHackNet/mod_sa

github.com