如何让鼠标在后台持续运行运行?

How to make mouse function run continuously in the background?

几天前,我问了一个问题并得到了答案。 但是,由于一些问题,我无法继续进行下去。 (=> How to implement mouse_event() to work continuously in MFC?)

(我正在尝试使用 Myo 制作一个像鼠标一样工作的 MFC 程序。)

首先,我做了一个Thread Function。

UINT CMyoControllerView::ThreadFunc(LPVOID pParam) {   
int index= (int)pParam; 

while(1) {
    if(index == 0) {        // Left Click
        //if Myo is in unlock state & Pose is Fist
        if(collector.isUnlocked == true && collector.currentPose == myo::Pose::fist) {
            mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, NULL);
            mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, NULL);
        }
    }
    else if(index == 1) {   //Double click
        if(collector.isUnlocked == true && collector.currentPose == myo::Pose::fist) {
            mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, NULL);
            mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, NULL);
            mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, NULL);
            mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, NULL); 
        }
    }
    else if(index == 2) {       // Right Click
        if(collector.isUnlocked == true && collector.currentPose == myo::Pose::fist) {  
            mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, NULL);
            mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, NULL);
        }
    }
    else if(index == 3) {       // Wheel Click
        if(collector.isUnlocked == true && collector.currentPose == myo::Pose::fist) {
            mouse_event(MOUSEEVENTF_MIDDLEDOWN, 0, 0, 0, NULL); 
            mouse_event(MOUSEEVENTF_MIDDLEUP, 0, 0, 0, NULL);
        }
    }
    else if(index == 4) {       // Wheel Scroll
        if(collector.isUnlocked == true && collector.currentPose == myo::Pose::fist) {
            mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 0, NULL);
        }
    }
    else { 
        continue;
    }
}
return 0;
}

这是当我在组合框中 select 一个选项时产生的消息。

void CMyoControllerView::OnCbnSelchangeComboFist()
{
int nIndex = m_combo_Fist.GetCurSel(); 

CString str; 

if(nIndex != CB_ERR){ 
    m_combo_Fist.GetLBText(nIndex, str); 

    if(str == "Left Click") {
        INDEX = 0;
    } else if(str == "Double Click") {
        INDEX = 1;
    } else if(str == "Right Click") {
        INDEX = 2;
    } else if(str == "Wheel Click") {
        INDEX = 3;
    } else {
        INDEX = 4;
    }
    }
    pThread_Fist = ::AfxBeginThread(ThreadFunc, (LPVOID)INDEX);
}

在我创建一个线程后(这个线程应该 运行 直到程序结束,因为我想让这个功能像鼠标一样工作。),我认为它会完美地工作。

但是,由于我在 ThreadFunc 中使用了 "while(1)",当我在组合框中 select 编辑一个选项时,我的程序冻结了。我还计划这个功能等到我解锁我的 Myo 并摆出一定的姿势,

当我摆姿势时,此功能会 "left click" 一次,但它会像永远一样持续进行左键单击。

请多多指教。 这是我的观点。

  1. 我想制作一个像鼠标一样工作的MFC程序。

  2. 我在制作线程 运行 的背景时遇到问题,并且在我想做的时候做 "click"。 (希望有其他解决方案..)

  3. 如果其中有任何严重问题,我不想大幅更改我的代码。
  4. 此外,我有 5 个组合框,所有五个组合框都与不同的点击事件(左、右、双等)链接。我计划同时制作 5 个线程和 运行。

你的线程函数有一个无限循环,无法终止不断发送 windows 消息,这通常是个坏主意。


让我们分析一下您的代码中发生了什么:

主线程:

void CMyoControllerView::OnCbnSelchangeComboFist()
{
    //... determine the action to be taken
    pThread_Fist = ::AfxBeginThread(ThreadFunc, (LPVOID)INDEX); // create a new thread on every OnCbnSelchangeComboFist() event.
}

线程核心:

while(1) 
{
    if(index == 0) 
    {        // Left Click
        // ... send mouse message
    }
    //...
}        

现在,由于您不更改线程中的索引值,循环将 运行 无限并无限发送鼠标消息,并且当 OnCbnSelchangeComboFist() 再次 运行s (如果它再次运行s)它将创建线程的另一个实例,从那时起你将有两个线程无限发送鼠标消息。