سيندكيس لا يعمل من لبستر محددة مسبقا.
سؤال
لدي QTimer
متصل ب TimerHandler
وظيفة.ال TimerHandler
يجب أن تفعل بلدي SendKeys
الوظيفة التي أعلنتها في القسم العام من رأسي.إذا كنت اكتب يدويا في النص ل SendKeys
وظيفة أنه يعطي الإخراج الصحيح.ولكن إذا كنت تمرير النص من محددة مسبقا LPSTR
يخرج القمامة.هنا هو رمز بلدي:
مشروعي.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
مشروعي.حزب الشعب الكمبودي
#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);
}
وهذا يجعل بلدي القمامة الناتج الموقت بدلا من النص داخل txtMessage
.إذا كنت تستخدم
SendText("test message", strlen("test message"));
بدلا من ذلك ، فإنه يخرج الرسالة بشكل صحيح.هل هناك شيء خاطئ مع قانون بلدي?
حاولت التصريح LPSTR txtMessage
داخل صفي في القسم العام في MyProject.h
لكن هذا أيضا لم ينجح.
المحلول
جعل txtMessage
a string
كائن (std::string
أو QString
, ، منذ كنت تستخدم كيو تي) ، وليس مؤشر.احصل على المؤشر من هذا الكائن مباشرة قبل إجراء المكالمة إلى SendText
أو ، حتى أسهل ، فقط اصنع SendText
خذ كائن سلسلة بدلا من المؤشر.
void SendText(const QString& str)
{
const char* message = str.c_str();
// whatever else you want to do
}
المشكلة هي أنك تقوم بتخزين مؤشر للبيانات في كائن مؤقت (convertme
).هذا الكائن يخرج من نطاق ويتم تدمير ويحصل على إعادة كتابة الذاكرة.السبب في أنها تعمل مع "رسالة الاختبار" هو ذلك يتم تخزين حرفية السلسلة بشكل مختلف.تحتاج إلى الاحتفاظ بالرسالة التي تحاول تخزينها في الذاكرة طوال الوقت.