几天前,我问了一个问题并得到了答案。 但是由于一些问题,我再也无法继续了。 (=> 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并采取某种姿势,
当我拍姿势时,这个功能会“左键单击”一次,但它会像永远一样不断地进行左键单击。
请给我一些建议。 这是我的观点。
我想制作一个像鼠标一样工作的MFC程序。
我在制作线程运行背景时遇到问题,并且在我想要的时候“点击”。 (希望另一种解决方案..)
答案 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()再次运行时(如果它再次运行),它将创建另一个线程的实例,从那时起你将有两个线程无限地发送鼠标消息。