Frage

Ich habe eine QTimer verbunden mit einem TimerHandler Funktion.Der TimerHandler sollte mein tun SendKeys funktion, die ich im öffentlichen Bereich meines Headers deklariert habe.Wenn ich den Text für die manuell eingebe SendKeys funktion es gibt eine korrekte Ausgabe.Aber wenn ich den Text von einem vordefinierten übergebe LPSTR es gibt Müll aus.Hier ist mein Code:

Mein Projekt.h

#ifndef MYPROJECT_H
#define MYPROJECT_H

#include <QtGui/QMainWindow>
#include "ui_myproject.h"
#include <qtimer.h>
#include <qmessagebox.h>
#include <Windows.h>

class MyProject : public QMainWindow
{
    Q_OBJECT

public:
    MyClass(QWidget *parent = 0, Qt::WFlags flags = 0);
    Ui::MyProjectClass ui;
    QTimer* SpamTimer;

    void SendText(char* message, int size)
    {
        int lc=0;
        do{
        keybd_event(VkKeyScan(message[lc]),0,KEYEVENTF_EXTENDEDKEY,0);
        keybd_event(VkKeyScan(message[lc]),0,KEYEVENTF_KEYUP,0);
        lc=lc+1;
        }while(lc<size);
        keybd_event(VK_RETURN,0,KEYEVENTF_EXTENDEDKEY,0);
        keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
    }

public slots:
    void StartBTNClick();
    void StopBTNClick();
    void TimerHandler();
};
#endif // MYPROJECT_H

Mein Projekt.cpp

#include "MyProject.h"

LPSTR txtMessage; // Message for SendKeys function.
int buffer;
bool TimerEnabled = 0;

MyClass::MainWindow(QWidget *parent, Qt::WFlags flags) // Intializing MainWindow
    : QMainWindow(parent, flags)
{
    ui.setupUi(this);
    statusBar()->showMessage("Status: Idle.");
    connect(ui.StartBTN, SIGNAL(clicked()), this, SLOT(StartBTNClick()));
    connect(ui.StopBTN, SIGNAL(clicked()), this, SLOT(StopBTNClick()));
}

void MyClass::StartBTNClick() // Starts the timer.
{
    int delay; // delay for QTimer
    bool ok;
    std::string convertme;

    QString TextMSG = ui.TextBox->text(); // Get text from 'line edit' for txtMessage.
    QString TimeMSG = ui.TimeBox->text(); // Get text from 2nd 'line edit' for delay.
    convertme = TextMSG.toStdString();
    txtMessage = const_cast<char*> (convertme.c_str()); // converted QString to LPSTR.
    buffer = strlen(txtMessage);
    delay = TimeMSG.toInt(&ok, 10); // converted QString to int.
    if (delay > 0)
    {
        QtTimer = new QTimer(this);
        connect(QtTimer, SIGNAL(timeout()), this, SLOT(TimerHandler()));
        TimerEnabled = 1;
        QtTimer->start(delay);
        statusBar()->showMessage("Status: Running.");
    }
    else if (delay < 0)
    {
        QMessageBox::warning(this, "Warning!", "Delay can't be \"0\" or lower than \"0\"!");
    }
    else
    {
        QMessageBox::warning(this, "Warning!", "Delay was not specified properly.");
    }
}

void MyClass::StopBTNClick() // Stops the timer.
{
    if (TimerEnabled == 1)
    {
        QtTimer->stop();
        disconnect(QtTimer, SIGNAL(timeout()), this, SLOT(TimerHandler()));
        TimerEnabled = 0;
        statusBar()->showMessage("Status: Idle.");
    }
}

void MyClass::TimerHandler() // Timer handles the SendKeys function
{
    SendText(txtMessage, buffer);
}

Dies führt dazu, dass mein Timer Müll ausgibt, anstatt den darin enthaltenen Text txtMessage.Wenn ich benutze

SendText("test message", strlen("test message"));

stattdessen wird die Nachricht korrekt ausgegeben.Stimmt etwas mit meinem Code nicht?

Ich habe versucht zu deklarieren LPSTR txtMessage in meiner Klasse im öffentlichen Bereich bei MyProject.h aber das hat auch nicht funktioniert.

War es hilfreich?

Lösung

Machen txtMessage a string Objekt (std::string oder QString, da Sie Qt verwenden), kein Zeiger.Holen Sie sich den Zeiger von diesem Objekt direkt vor dem Aufruf von SendText oder, noch einfacher, einfach machen SendText nehmen Sie ein String-Objekt anstelle eines Zeigers.

void SendText(const QString& str)
{
  const char* message = str.c_str();
  // whatever else you want to do
}

Das Problem ist, dass Sie einen Zeiger auf Daten in einem temporären Objekt speichern (convertme).Dieses Objekt verlässt den Gültigkeitsbereich und wird zerstört und der Speicher wird neu geschrieben.Der Grund, warum es mit "Testnachricht" funktioniert, ist der Folgende Zeichenfolgenliterale werden unterschiedlich gespeichert.Sie müssen die Nachricht, die Sie speichern möchten, die ganze Zeit im Speicher behalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top