如何让鼠标在后台持续运行运行?
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" 一次,但它会像永远一样持续进行左键单击。
请多多指教。
这是我的观点。
我想制作一个像鼠标一样工作的MFC程序。
我在制作线程 运行 的背景时遇到问题,并且在我想做的时候做 "click"。 (希望有其他解决方案..)
- 如果其中有任何严重问题,我不想大幅更改我的代码。
- 此外,我有 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)它将创建线程的另一个实例,从那时起你将有两个线程无限发送鼠标消息。
几天前,我问了一个问题并得到了答案。 但是,由于一些问题,我无法继续进行下去。 (=> 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" 一次,但它会像永远一样持续进行左键单击。
请多多指教。 这是我的观点。
我想制作一个像鼠标一样工作的MFC程序。
我在制作线程 运行 的背景时遇到问题,并且在我想做的时候做 "click"。 (希望有其他解决方案..)
- 如果其中有任何严重问题,我不想大幅更改我的代码。
- 此外,我有 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)它将创建线程的另一个实例,从那时起你将有两个线程无限发送鼠标消息。