Question

j'ai un QTimer connecté à un TimerHandler fonction. La TimerHandler devrait faire mon SendKeys fonction que j'ai déclaré dans la section publique de mon en-tête. Si je tape manuellement le texte pour le SendKeys fonction il donne une sortie correcte. Mais si je passe le texte d'un prédéfini LPSTR Il produit des ordures. Voici mon code:

Myproject.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

Myproject.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);
}

Cela fait de la sortie de ma minuterie à la place du texte à l'intérieur txtMessage. Si j'utilise

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

Au lieu de cela, il diffuse correctement le message. Y a-t-il quelque chose qui ne va pas avec mon code?

J'ai essayé de déclarer LPSTR txtMessage à l'intérieur de ma classe dans la section publique à MyProject.h Mais cela n'a pas non plus fonctionné.

Était-ce utile?

La solution

Faire, construire txtMessage un string objet (std::string ou QString, puisque vous utilisez QT), pas un pointeur. Obtenez le pointeur de cet objet juste avant de passer l'appel à SendText Ou, encore plus facile, faites juste SendText Prenez un objet String au lieu d'un pointeur.

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

Le problème est que vous stockez un pointeur vers les données dans un objet temporaire (convertme). Cet objet sort de la portée et est détruit et la mémoire est réécrite. La raison pour laquelle cela fonctionne avec `" Message de test "est que Les littéraux de cordes sont stockés différemment. Vous devez garder le message que vous essayez de stocker en mémoire tout le temps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top