Но этих символов нет в списке кодов виртуальных клавиш, поэтому я думаю, что не могу использовать SendInput для переназначения ...
~ и ` в списке кодов виртуальных клавиш .Это VK_OEM_3 (0xC0) .
Вы можете использовать SendInput, введите ~ и `вот так:
UINT result = 0;
DWORD errCode = 0;
tagINPUT inputArray[2] = {};
tagKEYBDINPUT keyboardInput[2] = {};
keyboardInput[1].wVk = 0xC0; // Virtual-Key code for the '`~' key.
keyboardInput[1].wScan = 0x29; // Scan code for the '`~' key.
inputArray[1].type = INPUT_KEYBOARD;
inputArray[1].ki = keyboardInput[1];
keyboardInput[0].wVk = 0x10; // Virtual-Key code for the 'shift' key.
keyboardInput[0].wScan = 0x2A; // Scan code for the 'shift' key.
inputArray[0].type = INPUT_KEYBOARD;
inputArray[0].ki = keyboardInput[0];
// Enter '~' (shift + '`~' key)
result = SendInput(2, inputArray, sizeof(tagINPUT));
errCode = GetLastError();
// Enter '`'
result = SendInput(1, &inputArray[1], sizeof(tagINPUT));
errCode = GetLastError();
Если вы хотите ввести эти два символа, SendMessage также может сделать это ( аналогичная проблема ):
LPCWSTR Target_window_Name = TEXT("Untitled - Notepad"); //<- Has to match window name
HWND hWindowHandle = FindWindow(NULL, Target_window_Name);
HWND EditClass = FindWindowEx(hWindowHandle, NULL, L"Edit", NULL);
SendMessage(EditClass, WM_KEYDOWN, 0xC0, 0x002C0001); //VK_OEM_3 0xC0
SendMessage(EditClass, WM_CHAR, 0x7E, 0x002C0001); //~
SendMessage(EditClass, WM_KEYUP, 0xC0, 0xC02C0001);
SendMessage(EditClass, WM_KEYDOWN, 0xC0, 0x002C0001); //VK_OEM_3 0xC0
SendMessage(EditClass, WM_CHAR, 0x60, 0x002C0001); //`
SendMessage(EditClass, WM_KEYUP, 0xC0, 0xC02C0001);
Ссылки: " SendInput " " SendMessage"
Для получения кода сканирования вы можете выполнить поиск" Спецификация кода сканирования клавиатуры - Microsoft ".