Pregunta

tengo un QTimer conectado a un TimerHandler función.El TimerHandler debería hacer mi SendKeys función que declaré en la sección pública de mi encabezado.Si escribo manualmente el texto del SendKeys función que da una salida correcta.Pero si paso el texto de un predefinido LPSTR produce basura.Aquí está mi código:

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

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

Esto hace que mi temporizador genere basura en lugar del texto que contiene. txtMessage.si uso

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

en cambio, genera el mensaje correctamente.¿Hay algún problema con mi código?

Intenté declarar LPSTR txtMessage dentro de mi clase en la sección pública en MyProject.h pero esto tampoco funcionó.

¿Fue útil?

Solución

Hacer txtMessage a string objeto (std::string o QString, ya que estás usando Qt), no un puntero.Obtenga el puntero de ese objeto justo antes de realizar la llamada a SendText o, incluso más fácil, simplemente haz SendText tome un objeto de cadena en lugar de un puntero.

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

El problema es que estás almacenando un puntero a datos en un objeto temporal (convertme).Este objeto sale del alcance, se destruye y la memoria se reescribe.La razón por la que funciona con "mensaje de prueba" es que los literales de cadena se almacenan de manera diferente.Debes mantener el mensaje que intentas almacenar en la memoria todo el tiempo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top