自定义键绑定



我正在一个ImGui项目上工作,我试图找到一种方法来创建自定义键绑定。我想把每一个VK键代码都列出来,if声明,但不仅会很笨重,而且我也不会带某些键,比如一些独特的鼠标按钮或任何其他我可能会丢失的键。我想要一个函数,它将下一个鼠标或键盘输入存储为一个整数,而不使用预定义的可用输入集。我想动态识别任何输入键

最小的例子:

const char* cbind0 = "none";
static bool bbind0 = false;
static int ibind0;
if (ImGui::Button(cbind0))
bbind0 = true
if (bbind0 == true)
{
cbind0 = "press any key...";
CopyNextInputTo(ibind0); // Function to copy pressed key to our integer
}

这段代码将在GUI中显示为一个框,然后包含我们现在确定的键绑定的整数ibind0将像这样使用:

static bool option = false;
if (GetAsyncKeyState(ibind0) & 1)
{
option =! option; 
}

现在我们可以使用GUI复选框或按下用户确定的键来切换选项的开启和关闭。现在唯一的问题是我不知道如何动态记录所有可能的输入!有人知道可能的函数或方法吗?谢谢!

假设您是创建您正在使用ImGui上的窗口的人,您可以在WNDPROC回调中处理WM_KEYDOWN事件。下面是一个基本的示例,当您按下一个键时,将创建一个弹出消息框:

#ifndef UNICODE
#define UNICODE
#endif 
#include <Windows.h>
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) {
const wchar_t WINDOW_CLASS_NAME[] = L"Keyboard Listener Class";
const wchar_t WINDOW_TITLE[] = L"Keyboard Listener";
WNDCLASS windowClass{};
windowClass.lpfnWndProc = WindowProc;
windowClass.hInstance = hInstance;
windowClass.lpszClassName = WINDOW_CLASS_NAME;
RegisterClass(&windowClass);
HWND hWnd = CreateWindowEx(
0,
WINDOW_CLASS_NAME,
WINDOW_TITLE,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 
CW_USEDEFAULT, 
CW_USEDEFAULT, 
CW_USEDEFAULT,
NULL,   
NULL,
hInstance,
NULL
);
if (hWnd == NULL) {
return EXIT_FAILURE;
}
ShowWindow(hWnd, nCmdShow);
MSG msg{};
while (GetMessage(&msg, NULL, 0, 0) > 0) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return EXIT_SUCCESS;
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_DESTROY:
PostQuitMessage(0);
return EXIT_SUCCESS;
case WM_KEYDOWN:
wchar_t keyName[64];
GetKeyNameText(lParam, keyName, sizeof(keyName));
MessageBox(hWnd, keyName, L"Key Pressed!", MB_OK);
return EXIT_SUCCESS;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return EXIT_SUCCESS;
}

或者,如果你不是实际创建窗口的人,你可以使用SetWindowsHookExidHook参数设置为WH_KEYBOARD,并将KeyboardProc回调传递给lpfn参数,从而挂钩到另一个窗口的键盘事件。

最新更新