SendKeys ne fonctionne pas à partir du LPSTR prédéfini.
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é.
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.