Probably a lot of fails in the coding but nevermind that please. I am still learning it. At the moment I made a simple GUI with just one function. Repeat a text someone shouted.
It will send 3 keystrokes each loop.
1. Spacebar
2. Arrow up
3. Enter key
Only thing is, the focus works, but no key strokes are send, nor am I receiving any error codes.
Could someone please be so kind to tell me what I am doing wrong? and please go easy on me since I am a C++ noob still :P
my header file:
Code:
#ifndef PROCESS_H #define PROCESS_H #include <QObject> #include <QLabel> #include <QSlider> #include <QMessageBox> #include <windows.h> struct extraKeyInfo { unsigned short repeatCount; unsigned char scanCode; bool extendedKey, prevKeyState, transitionState; operator unsigned int() { return repeatCount | (scanCode << 16) | (extendedKey << 24) | (prevKeyState << 30) | (transitionState << 31); } }; class initiateProcess : public QObject, public extraKeyInfo { Q_OBJECT public: int &amount; QLabel *label; QSlider *slider; initiateProcess( int &amount, QLabel *label, QSlider *slider ) : amount( amount ), label( label ), slider( slider ) {} private: void pressKey( short code ) { HWND hNotepad = FindWindow(0, L"Naamloos - Kladblok"); if(!hNotepad){ QMessageBox iWindow; iWindow.setWindowTitle("Window not found"); iWindow.setText("The window was not found"); iWindow.exec(); } SetForegroundWindow(hNotepad); short vkCode = LOBYTE(VkKeyScan(code)); extraKeyInfo lParam = {}; lParam.scanCode = MapVirtualKey(vkCode, 29); PostMessage(hNotepad, WM_KEYDOWN, vkCode, lParam); lParam.repeatCount = 1; lParam.prevKeyState = true; lParam.transitionState = true; PostMessage(hNotepad, WM_KEYUP, vkCode, lParam); Sleep(100); } public slots: void startProcess( ){ // update the label to status "executing" label->setText("<strong><font color=\"red\">executing</font></strong>"); // update the amount according to the chosen // value with the slider / spinbox amount = slider->value(); // loop through the amount of repeats if( amount != 0 ) { // bring the window to the front HWND GameWindow = FindWindow(0, L"Naamloos - Kladblok"); SetForegroundWindow(GameWindow); // execute the loop for( int i = 0; i < amount; i++ ){ // not the last loop so add a pause at the end if( i < (amount-1)) { pressKey( VK_SPACE ); pressKey( 't' ); Sleep(2000); } // last loop so dont add a pause at the end else { pressKey( VK_SPACE ); pressKey( 't' ); } } } else { // show a message box with an error QMessageBox popup; popup.setWindowTitle("NO AMOUNT CHOSEN!"); popup.setText("You have to chose an amount of shouts for me to repeat!\nIf you fail to do so I cannot repeat your shouts! doh, kupo!"); QPixmap popupIco("C:/Users/Username/Desktop/FFXIV Auto Shouter/favicon.png"); popup.setIconPixmap(popupIco); popup.exec(); } // update the label to status "finished" label->setText("<strong><font color=\"green\">finished</font></color>"); } }; #endif // PROCESS_H
Code:
#include <QApplication> #include <QWidget> #include <QObject> #include <QHBoxLayout> #include <QVBoxLayout> #include <QSlider> #include <QSpinBox> #include <QPushButton> #include <QMessageBox> #include <QLabel> #include <QSound> #include <windows.h> #include "PROCESS.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); // create a main window widget QWidget *main = new QWidget; main->setWindowTitle("FFXIV Auto Shouter"); main->setWindowIcon(QIcon("C:/Users/ User /Desktop/FFXIV Auto Shouter/favicon.png")); main->setFixedWidth(325); // create the widgets which we will use QLabel *label1 = new QLabel("Amount: "); QLabel *label2 = new QLabel("<strong><font color=\"orange\">Configuring</font></strong>"); QSlider *slider = new QSlider(Qt::Horizontal); QSpinBox *spinbox = new QSpinBox; QPushButton *button = new QPushButton; // connect the slider and the box for synchronisation QObject::connect(slider, SIGNAL(valueChanged(int)), spinbox, SLOT(setValue(int))); QObject::connect(spinbox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int))); // connect the start button to the class and start // executing the process of repeated shouting, but first // we will set some options to be able to do all of this int amount = 0; initiateProcess execFunction( amount, label2, slider ); QObject::connect(button, SIGNAL(clicked()), &execFunction, SLOT(startProcess())); // configurate the widgets slider->setRange(1, 199); spinbox->setRange(1, 199); slider->setValue(1); button->setText("SHOUT"); // styling templates for the widgets slider->setStyleSheet("background:#000; color:#FFFFFF;"); spinbox->setStyleSheet("background:#000; color:#FFFFFF;"); button->setStyleSheet("background:#000; color:#FFFFFF;"); // tooltips for the widgets slider->setToolTip("Select the amount of shouts you want to repeat"); spinbox->setToolTip("Select the amount of shouts you want to repeat"); button->setToolTip("Click here to start shouting"); // create the bounding boxes QHBoxLayout *wrapper = new QHBoxLayout; QHBoxLayout *leftside = new QHBoxLayout; QVBoxLayout *rightside = new QVBoxLayout; // add the widgets to the boxes leftside->addWidget(label1); leftside->addWidget(slider); leftside->addWidget(spinbox); rightside->addWidget(button); rightside->addWidget(label2); // add the boxes to each other wrapper->addLayout(leftside); wrapper->addLayout(rightside); // set a couple of sounds QSound bootSND("C:/Users/User/Desktop/FFXIV Auto Shouter/greetings.wav"); // start up QSound executeSND("C:/Users/ User /Desktop/FFXIV Auto Shouter/execute.wav"); // starting loop QSound finishedSND("C:/Users/ User /Desktop/FFXIV Auto Shouter/cheer.wav"); // finished loop // play at startup bootSND.play(); // show the widget main->setLayout(wrapper); main->show(); return app.exec(); }