Pergunta

eu tenho um QTimer conectado a um TimerHandler função.O TimerHandler deveria fazer o meu SendKeys função que declarei na seção pública do meu cabeçalho.Se eu digitar manualmente o texto do SendKeys função fornece uma saída correta.Mas se eu passar o texto de um pré-definido LPSTR produz lixo.Aqui está o meu código:

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

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

Isso torna a saída do meu cronômetro um lixo, em vez do texto dentro txtMessage.Se eu usar

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

em vez disso, ele exibe a mensagem corretamente.Há algo errado com meu código?

Eu tentei declarar LPSTR txtMessage dentro da minha classe na seção pública em MyProject.h mas isso também não funcionou.

Foi útil?

Solução

Fazer txtMessage a string objeto (std::string ou QString, já que você está usando Qt), não um ponteiro.Obtenha o ponteiro desse objeto antes de fazer a chamada para SendText ou, ainda mais fácil, apenas faça SendText pegue um objeto string em vez de um ponteiro.

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

O problema é que você está armazenando um ponteiro para dados em um objeto temporário (convertme).Este objeto sai do escopo e é destruído e a memória é reescrita.A razão pela qual funciona com `"mensagem de teste" é que literais de string são armazenados de maneira diferente.Você precisa manter a mensagem que está tentando armazenar na memória o tempo todo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top