Итак, из того, что я собрал здесь и на других сайтах, я совершил ошибку, пытаясь запустить оператор вне функции. Здесь есть и другие замечательные предложения, которые я рекомендую всем, у кого есть вопросы, аналогичные тем, которые я читал, но с помощью человека ( Теда Бёрка ), чей код я основал на своем, я Я считаю, что я достиг того, чего изначально хотел. Тед порекомендовал мне объявить ip
глобально и одновременно инициализировать его следующим образом:
INPUT ip = {.type = INPUT_KEYBOARD, .ki.wScan = 0, .ki.time = 0, .ki.dwExtraInfo = 0};
Я попытался, но компилятор выдал мне ошибки, поэтому я переписал это так:
(ошибки компилятора меня смущали, поэтому бонус указывает на того, кто может объяснить, почему следующий код работал, а Тед не работал)
TL; DR Solution
INPUT ip = {ip.type = INPUT_KEYBOARD,
ip.ki.wScan = 0,
static_cast<LONG>(ip.ki.time = 0),
ip.ki.dwExtraInfo = 0};
Причина этого static_cast<LONG>
заключается в том, что CLion обнаружил следующее: «Невыраженное выражение не может быть сужено от типа« DWORD »(он же« unsigned long ») до« LONG »(он же« long ») в списке инициализатора. ".
Мне нравится это решение, потому что таким образом нам не нужно создавать экземпляр объекта INPUT для каждого нажатия клавиши. Я знаю, что в этом случае прирост производительности как во времени, так и в памяти, вероятно, будет незначительным (возможно, даже благодаря тому, что компилятор оптимизировал мой первый код, это даже не было необходимо?), Но с логической точки зрения, мне было ненужно Повторите создание экземпляра INPUT сотни раз, когда его можно создать только один раз.
Я вижу, что я могу использовать SendInput
не в лучшем образце, и что я могу просто использовать press_keys("\r")
и избавиться от press_enter()
. Я посмотрю на эти изменения, чтобы улучшить свой код, но сейчас моя основная задача была выполнена. Спасибо всем!
Это финальная версия моего кода:
#define WINVER 0x0500
#include <windows.h>
#include <string>
INPUT ip = {ip.type = INPUT_KEYBOARD,
ip.ki.wScan = 0,
static_cast<LONG>(ip.ki.time = 0),
ip.ki.dwExtraInfo = 0};
HKL kbl = GetKeyboardLayout(0);
void press_enter() {
// Press enter
ip.ki.wVk = 0x0D;
ip.ki.dwFlags = 0; // 0 for key press
SendInput(1, &ip, sizeof(INPUT));
// Release the key
ip.ki.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP for key release
SendInput(1, &ip, sizeof(INPUT));
Sleep(25);
}
void press_keys(std::string& text_to_write) {
for (char& c : text_to_write) {
// Press the corresponding 'c' key
ip.ki.wVk = VkKeyScanEx(c, kbl);; // virtual-key code for the "a" key
ip.ki.dwFlags = 0; // 0 for key press
SendInput(1, &ip, sizeof(INPUT));
// Release the key
ip.ki.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP for key release
SendInput(1, &ip, sizeof(INPUT));
Sleep(25);
}
}
void give_100000(std::string& item) {
for (int i = 0; i < 10; i++) {
press_keys(item);
Sleep(25);
press_enter();
Sleep(25);
press_enter();
Sleep(25);
}
}
int main() {
// Pause for 5 seconds.
Sleep(5000);
std::string lumber = "lumberjack";
std::string food = "cheese steak jimmy's";
std::string gold = "robin hood";
std::string stone = "rock on";
give_100000(lumber);
give_100000(food);
give_100000(gold);
give_100000(stone);
// Exit normally
return 0;
}