#include <windows.h>typedef void (*ME)(__in DWORD dwFlags, __in DWORD dx, __in DWORD dy, __in DWORD dwData, __in ULONG_PTR dwExtraInfo);...QLibrary myLib("user32.dll");ME me= (ME)myLib.resolve("mouse_event");me(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);me(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);// mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); <- так выдаёт ошибку компиляции.
class DownMouseButtonThread : public QThread{ Q_OBJECTpublic: DownMouseButtonThread(){ moveToThread(this); this->myLib = new QLibrary("user32.dll"); this->me = (ME)this->myLib->resolve("mouse_event");} ~DownMouseButtonThread() { delete this->myLib; } void run() { this->exec(); }// вызываем из главного потока после me(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);// убеждаемся, что "зависшее" зажимание "отвисло" после отпускания, которое вызвано из главного потока void WaitOnButtonDown() { this->sem.acquire(); } public slots: void onSetButtonDown(){ // зажимаем мышь в этом потоке this->me(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); // здесь ошибка выполнения this->sem.release();}private: QSemaphore sem; QLibrary *myLib; ME me;};
#include <windows.h>#pragma comment (lib, "user32.lib")
class DownMouseButtonThread : public QThread{ Q_OBJECTpublic: DownMouseButtonThread() { moveToThread(this); } void run(){ do { this->OnCommandSem.acquire(); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); // !!! застревает здесь !!! this->sem.release(); } while(true);} void SetButtonDown() { this->OnCommandSem.release(); } // убеждаемся, что "зависшее" зажимание "отвисло" после отпускания, которое вызвано из главного потока void WaitOnButtonDown() { this->sem.acquire(); }private: QSemaphore sem; QSemaphore OnCommandSem;};...// создаём потокDownMouseButtonThread DownMouseButtonThread;DownMouseButtonThread.start();...// при зажатии кнопки мышиDownMouseButtonThread.SetButtonDown();...// при отжатии кнопкиmouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);DownMouseButtonThread.WaitOnButtonDown();