mouse_event()使用,纯新手问题

zjk2752 2010-03-25 10:38:53
我先来讲解下啊:

void CBallsRaceView::OnLButtonDown(UINT nFlags, CPoint point)
{
this->SetTimer(1,10,NULL);
int i=0;
for(i=0;i<5;i++)
{
ResumeThread(_hThread[i]);
}

上面着段代码大家都知道,就是当鼠标左键按下去的时候就执行这个函数,这个函数就激活五个线程。
我的问提是这样的:现在我的鼠标坏了,点不了了。然后人家要求我用mouse_event()这个函数来模拟鼠标左键单击。
也就是说当mouse_event()执行后,OnLButtonDown()就执行。不知道能不能这样实现。如果能的话,着个mouse_event()函数应该放在什么位置呢?
CBallsRaceView这是个视图类。还有其他几个类,文档类,应用程序类,还有个主窗口类。
诚心找个好心人,帮个忙。分数我有的是。
...全文
1579 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
qc_jmy 2010-03-26
  • 打赏
  • 举报
回复
设置位置,通过发消息来实现。
踏实每一步 2010-03-26
  • 打赏
  • 举报
回复
任何windows消息都有个窗口来接受并响应,你mouse_event没发送到CBallsRaceView窗口,就不能响应到。
zjk2752 2010-03-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lintchd 的回复:]
在什么位置都可以。mouse_event执行后 执行OnLButtonDown是肯定的,不过这样还要处理坐标要在对应的view里,不如直接发消息
[/Quote]
我觉得你这句可能说到点子上了:还要处理坐标要在对应的view里。其实我这个程序对坐标位置没限制的,在屏幕的任何位置点击都可。我也试过在画图程序段之后加上mouse_event,的确有反应,但就是OnLButtonDown没有运行。我的界面是这样的,在一个主窗口里画了五个小球,在窗口任一位置点饥,五个小球就开始运动。
那么mouse_event没有 触发OnLButtonDown是不是和视图有关呀?
这不是鸭头 2010-03-26
  • 打赏
  • 举报
回复
先移动到指定的位置,然后点击,之后再移动回来....
快乐鹦鹉 2010-03-26
  • 打赏
  • 举报
回复
得记录鼠标的动作位置,然后用mouse_event来回放该动作。你必须自己指定这个坐标。
zjk2752 2010-03-26
  • 打赏
  • 举报
回复
我把这两句话
mouse_event(MOUSEEVENTF_LEFTDOWN,10000,20000,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,10000,20000,0,0);
加到了OnCreate函数最末尾,结果出现很诡异的事情。是这样的,把上面的代码加上后,保存,运行,出现界面,但还是要自己点下鼠标后小求才开始运动,可是第二次再点叹号运行的时候就可以了,这时候就不用我点鼠标了小求自己就开始动起来了,并且出现了两个界面。第二个仍然要自己点下小求才动。这是怎么回是呢?
是不是不应该把mouse_event放在OnCreate里呢。求大家帮忙呀,把这个解决了我给很多的技术分给你,跪求神人降临!
我把我的代码发下:

int CBallsRaceView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

int i = 0;
DWORD ThreadID[5];
static DWORD ThreadArg[5] = {HIGHEST_THREAD,ABOVE_AVE_THREAD,NORMAL_THREAD,
BELOW_AVE_THEAD,LOWEST_THREAD};
for(i=0;i<5;i++) //这一部分使用来创建线程的,控制小求的运动
{
_hThread[i] = ::CreateThread(NULL,0,
(LPTHREAD_START_ROUTINE)ThreadProc,
&ThreadArg[i],
CREATE_SUSPENDED,
&ThreadID[i]);
}
for(i=0;i<5;i++)
{
_hEvent[i] = ::CreateEvent(NULL,TRUE,TRUE,NULL);

}
SetThreadPriority(_hThread[0],THREAD_PRIORITY_HIGHEST);
SetThreadPriority(_hThread[1],THREAD_PRIORITY_ABOVE_NORMAL);
SetThreadPriority(_hThread[2],THREAD_PRIORITY_NORMAL);
SetThreadPriority(_hThread[3],THREAD_PRIORITY_BELOW_NORMAL);
SetThreadPriority(_hThread[4],THREAD_PRIORITY_LOWEST);

// TODO: Add your specialized creation code here
PIXELFORMATDESCRIPTOR pixelDesc;//下面着部分是OpenGL画图的,大家不用管

pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pixelDesc.nVersion = 1;
pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW |PFD_SUPPORT_OPENGL |PFD_DOUBLEBUFFER |PFD_STEREO_DONTCARE;

pixelDesc.iPixelType = PFD_TYPE_RGBA;
pixelDesc.cColorBits = 32;
pixelDesc.cRedBits = 8;
pixelDesc.cRedShift = 16;
pixelDesc.cGreenBits = 8;
pixelDesc.cGreenShift = 8;
pixelDesc.cBlueBits = 8;
pixelDesc.cBlueShift = 0;
pixelDesc.cAlphaBits = 0;
pixelDesc.cAlphaShift = 0;
pixelDesc.cAccumBits = 64;
pixelDesc.cAccumRedBits = 16;
pixelDesc.cAccumGreenBits = 16;
pixelDesc.cAccumBlueBits = 16;
pixelDesc.cAccumAlphaBits = 0;
pixelDesc.cDepthBits = 32;
pixelDesc.cStencilBits = 8;
pixelDesc.cAuxBuffers = 0;
pixelDesc.iLayerType = PFD_MAIN_PLANE;
pixelDesc.bReserved = 0;
pixelDesc.dwLayerMask = 0;
pixelDesc.dwVisibleMask = 0;
pixelDesc.dwDamageMask = 0;


HWND hWnd = GetSafeHwnd();
HDC hDC = ::GetDC(hWnd);
m_GLPixelIndex = ChoosePixelFormat( hDC, &pixelDesc);
if (SetPixelFormat( hDC, m_GLPixelIndex, &pixelDesc)==FALSE)
{
return -1;
}
m_hGLContext = wglCreateContext(hDC);

// this->SetTimer(1,50,NULL);
//mouse_event(MOUSEEVENTF_LEFTDOWN||MOUSEEVENTF_LEFTUP,20000,20000,0,0);
mouse_event(MOUSEEVENTF_LEFTDOWN,10000,20000,0,0); //这一块是我根据大家的意见该的,
mouse_event(MOUSEEVENTF_LEFTUP,10000,20000,0,0);
// ::SetCursorPos(30000,30000);
// Sleep(100);
// mouse_event(MOUSEEVENTF_LEFTDOWN,10000,10000,0,0);
// Sleep(10);
// mouse_event(MOUSEEVENTF_LEFTUP,10000,10000,0,0);
//Sleep(10);
return 0;
}
wocaohaofan 2010-03-26
  • 打赏
  • 举报
回复
::SetCursorPos(860,848);
Sleep(100);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
Sleep(10);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
Sleep(10);
zjk2752 2010-03-26
  • 打赏
  • 举报
回复
其实我做的是这本书上的一个例题《Windows多线程编程技术与实例》郝文化 主编 第七章小球赛跑程序
SullenSun 2010-03-26
  • 打赏
  • 举报
回复
鼠标坏了?
在ONpaint中添加GetDlgItem(YourButtonID)->SetFocus();
再按一下空格就可以了。。。
324234234134 2010-03-26
  • 打赏
  • 举报
回复
在什么位置都可以。mouse_event执行后 执行OnLButtonDown是肯定的,不过这样还要处理坐标要在对应的view里,不如直接发消息
小生我怕怕 2010-03-26
  • 打赏
  • 举报
回复
其实我这个程序对坐标位置没限制的,在屏幕的任何位置点击都可。????????????????
那你就产生些随机坐标,然后用mouse_event来回放该动作~~~
yiruirui0507 2010-03-26
  • 打赏
  • 举报
回复
顶楼主!!我刚才也试验了,不行的!

期待高手的献身说法!!!!
zjk2752 2010-03-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 nola 的回复:]
任何windows消息都有个窗口来接受并响应,你mouse_event没发送到CBallsRaceView窗口,就不能响应到。
[/Quote]
那我应该怎么办呢?如何才能使mouse_event和CBallsRaceView对应起来呢?mouse_event这个语句应该加在什么地方呢?
cnzdgs 2010-03-26
  • 打赏
  • 举报
回复
可以用mouse_event模拟鼠标点击,当要模拟的时候执行mouse_event。
模拟输入一般是用于控制其它程序的,自己的程序直接调用响应函数即可,也可以发消息来触发响应函数。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧