为什么我模拟鼠标单击不成功?

dhfly 2006-03-20 11:54:30
我要模拟鼠标单击,但不要用SetCursorPos函数先把鼠标移动到目的地,因为这样要干涉我干别的事。
比如模拟在屏幕(644,256)的坐标单击左键。我用:
mouse_event(MOUSETF_EVENTABSOLUTE | MOUSETF_EVENTLBUTTONDOWN, 644*1024/65535, 256*768/65535, 0, 0);
mouse_event(MOUSETF_EVENTABSOLUTE | MOUSETF_EVENTLBUTTUP, 644*1024/65535, 256*768/65535, 0, 0);
不能实现要求啊。(上面常量参数可能拼写有误,程序里写的是对的。)

如果用下面的代码就可以:
SetCursorPos(644,256);
mouse_event( MOUSETF_EVENTLBUTTONDOWN, 0,0, 0, 0);
mouse_event( MOUSETF_EVENTLBUTTUP, 0,0, 0, 0);
这样就移动了鼠标,干扰了我做别的事。
哪位帮个忙,怎样不移动鼠标实现,上面的错在哪里???
...全文
253 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dhfly 2006-03-23
  • 打赏
  • 举报
回复
whwjn(菜鸟学飞) ( ) 信誉:86 2006-03-22 19:24:00 得分: 0


RealPlayer的那个是Edit,不是按钮,你用Spy++跟踪可以看出,模拟鼠标消息

HWND hWndParent=::FindWindow("GeminiWindowClass",NULL);//得到目标窗口句柄
::PostMessage(hWndParent,WM_LBUTTONDOWN,MK_LBUTTON,MAKELPARAM(35,73));
::PostMessage(hWndParent,WM_LBUTTONUP,0,MAKELPARAM(35,73));

__________________________________________
有点眉目,不太明白,他怎么用Edit做按钮呢。我spy++用的不是很熟,也看了一下,的确有两个Edit,但是显示不出来啊。那个播放按钮好像是一个什么播放控件上的吧?
xqk 2006-03-22
  • 打赏
  • 举报
回复
用 mouse_event 试试
whwjn 2006-03-22
  • 打赏
  • 举报
回复
RealPlayer的那个是Edit,不是按钮,你用Spy++跟踪可以看出,模拟鼠标消息

HWND hWndParent=::FindWindow("GeminiWindowClass",NULL);//得到目标窗口句柄
::PostMessage(hWndParent,WM_LBUTTONDOWN,MK_LBUTTON,MAKELPARAM(35,73));
::PostMessage(hWndParent,WM_LBUTTONUP,0,MAKELPARAM(35,73));
whwjn 2006-03-22
  • 打赏
  • 举报
回复
下面代码测试过,是可以的,原理是先找到目标窗口的按钮句柄,然后向它发送BN_CLICKED消息


void CDoClickDlg::OnButton1()
{
// TODO: Add your control notification handler code here
SetTimer(1,3000,NULL);
}

void CDoClickDlg::Proc()
{
char chBuf[100];
HWND hWnd1=::FindWindow(NULL,"Test");//得到目标窗口句柄
HWND hWnd=::GetWindow(hWnd1,GW_CHILD);//得到目标窗口的第一个子窗口句柄
while (::GetWindow(hWnd,GW_HWNDNEXT)!=NULL)
{
hWnd=::GetWindow(hWnd,GW_HWNDNEXT);
::GetWindowText(hWnd,chBuf,100);
if (CString(chBuf)=="Button1")//比较子窗口句柄是否为需要的
{
break;
}
}
::SendMessage(hWnd1,WM_COMMAND,MAKEWPARAM(::GetDlgCtrlID(hWnd),BN_CLICKED),(LPARAM)hWnd);
}

void CDoClickDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
Proc();
CDialog::OnTimer(nIDEvent);
}
dhfly 2006-03-22
  • 打赏
  • 举报
回复
那我怎样才能知道哪个按钮的标题呢。比如RealPlayer的播放按钮,只有一个三角图标,不知道窗口标题啊。
dhfly 2006-03-21
  • 打赏
  • 举报
回复
2楼的方法不行,我的程序是要不停的发送消息,没秒发几次,只要鼠标动了我就干不成别的活了:(
Snow_Ice11111 2006-03-21
  • 打赏
  • 举报
回复
加一个变量,用来记录鼠标原来的位置,模拟鼠标的动作完成后用这个变量来还原鼠标的原来位置,就象什么也没发生过,大致代码如下:
POINT Point;
GetCursorPos(&Point); //先把原来的鼠标位置记录在Point中

//模拟鼠标拖动
SetCursorPos(644, 256);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);

SetCursorPos(Point.x, Point.y); //还原的鼠标的原来位置
whwjn 2006-03-21
  • 打赏
  • 举报
回复
用SendInput试试看

16,471

社区成员

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

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

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