Skip to content

Instantly share code, notes, and snippets.

@JoelLinn
Last active April 17, 2020 23:05
Show Gist options
  • Save JoelLinn/8c23da0b685c21553473ba10cd388ed9 to your computer and use it in GitHub Desktop.
Save JoelLinn/8c23da0b685c21553473ba10cd388ed9 to your computer and use it in GitHub Desktop.
XInputGetKeystroke Test.
#include <iostream>
#include <iomanip>
#include <map>
#include <thread>
#include <chrono>
#include "Windows.h"
#include "Xinput.h"
static const std::map<int, std::string_view> vk = {
{VK_PAD_A , "VK_PAD_A" },
{VK_PAD_B , "VK_PAD_B" },
{VK_PAD_X , "VK_PAD_X" },
{VK_PAD_Y , "VK_PAD_Y" },
{VK_PAD_RSHOULDER , "VK_PAD_RSHOULDER" },
{VK_PAD_LSHOULDER , "VK_PAD_LSHOULDER" },
{VK_PAD_LTRIGGER , "VK_PAD_LTRIGGER" },
{VK_PAD_RTRIGGER , "VK_PAD_RTRIGGER" },
{VK_PAD_DPAD_UP , "VK_PAD_DPAD_UP" },
{VK_PAD_DPAD_DOWN , "VK_PAD_DPAD_DOWN" },
{VK_PAD_DPAD_LEFT , "VK_PAD_DPAD_LEFT" },
{VK_PAD_DPAD_RIGHT , "VK_PAD_DPAD_RIGHT" },
{VK_PAD_START , "VK_PAD_START" },
{VK_PAD_BACK , "VK_PAD_BACK" },
{VK_PAD_LTHUMB_PRESS , "VK_PAD_LTHUMB_PRESS" },
{VK_PAD_RTHUMB_PRESS , "VK_PAD_RTHUMB_PRESS" },
{VK_PAD_LTHUMB_UP , "VK_PAD_LTHUMB_UP" },
{VK_PAD_LTHUMB_DOWN , "VK_PAD_LTHUMB_DOWN" },
{VK_PAD_LTHUMB_RIGHT , "VK_PAD_LTHUMB_RIGHT" },
{VK_PAD_LTHUMB_LEFT , "VK_PAD_LTHUMB_LEFT" },
{VK_PAD_LTHUMB_UPLEFT , "VK_PAD_LTHUMB_UPLEFT" },
{VK_PAD_LTHUMB_UPRIGHT , "VK_PAD_LTHUMB_UPRIGHT" },
{VK_PAD_LTHUMB_DOWNRIGHT , "VK_PAD_LTHUMB_DOWNRIGHT" },
{VK_PAD_LTHUMB_DOWNLEFT , "VK_PAD_LTHUMB_DOWNLEFT" },
{VK_PAD_RTHUMB_UP , "VK_PAD_RTHUMB_UP" },
{VK_PAD_RTHUMB_DOWN , "VK_PAD_RTHUMB_DOWN" },
{VK_PAD_RTHUMB_RIGHT , "VK_PAD_RTHUMB_RIGHT" },
{VK_PAD_RTHUMB_LEFT , "VK_PAD_RTHUMB_LEFT" },
{VK_PAD_RTHUMB_UPLEFT , "VK_PAD_RTHUMB_UPLEFT" },
{VK_PAD_RTHUMB_UPRIGHT , "VK_PAD_RTHUMB_UPRIGHT" },
{VK_PAD_RTHUMB_DOWNRIGHT , "VK_PAD_RTHUMB_DOWNRIGHT" },
{VK_PAD_RTHUMB_DOWNLEFT , "VK_PAD_RTHUMB_DOWNLEFT" },
};
int main() {
XINPUT_KEYSTROKE stroke = {};
do {
auto status = XInputGetKeystroke(0, 0, &stroke);
switch (status) {
case ERROR_EMPTY:
//std::cout << "Queue empty." << std::endl;
break;
case ERROR_DEVICE_NOT_CONNECTED:
std::cout << "Not connected." << std::endl;
return -1;
break;
case ERROR_SUCCESS: {
static auto last = std::chrono::high_resolution_clock::now();
const auto now = std::chrono::high_resolution_clock::now();
const auto dur = std::chrono::duration_cast<std::chrono::milliseconds>(now - last).count();
{
using namespace std;
cout << right << setw(5) << dur << "ms";
cout << " " << left << setw(23) << vk.at(stroke.VirtualKey);
cout << ((stroke.Flags & XINPUT_KEYSTROKE_KEYDOWN) ? " DOWN" : " ");
cout << ((stroke.Flags & XINPUT_KEYSTROKE_KEYUP) ? " UP" : " ");
cout << ((stroke.Flags & XINPUT_KEYSTROKE_REPEAT) ? " REPEAT" : " ");
cout << endl;
}
last = now;
break;
}
}
//std::this_thread::sleep_for (std::chrono::milliseconds(1000/60));
} while (true);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment