如何让鼠标功能在后台连续运行?

时间:2015-06-01 11:04:37

标签: c++ multithreading mfc

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

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

首先,我创建了一个Thread函数。

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;
}

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

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)”,当我在组合框中选择了一个选项时,我的程序就冻结了。此外,我计划这个功能等到我解锁Myo并采取某种姿势,

当我拍姿势时,这个功能会“左键单击”一次,但它会像永远一样不断地进行左键单击。

请给我一些建议。 这是我的观点。

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

  2. 我在制作线程运行背景时遇到问题,并且在我想要的时候“点击”。 (希望另一种解决方案..)

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

1 个答案:

答案 0 :(得分:0)

你的线程函数有一个无限循环,无法终止发送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()再次运行时(如果它再次运行),它将创建另一个线程的实例,从那时起你将有两个线程无限地发送鼠标消息。