请问如何用PostMessage/SendMessage实现模拟鼠标双击?

cuteair 2011-04-20 03:15:22
我要用程序实现后台模拟鼠标双击其他程序的listview32中的item用
::PostMessage(j2,WM_LBUTTONDOWN,1,17+34*65536);//坐标是用spy++看真是鼠标双击得出来的第一行某点的坐标
::PostMessage(j2,WM_LBUTTONUP,NULL,17+34*65536);
::PostMessage(j2,WM_LBUTTONDOWN,1,17+34*65536);
::PostMessage(j2,WM_LBUTTONUP,NULL,17+34*65536);
可以选中此item,但不双击。


用 ::PostMessage(j2,WM_LBUTTONDBLCLK,1,17+34*65536); 没反应。

看到网上有代码
NMHDR nmh;
nmh.code = NM_DBLCLK; // Message type defined by control.
nmh.idFrom = ::GetDlgCtrlID(j2);
nmh.hwndFrom = j2;
::SendMessage(j1,WM_NOTIFY,(WPARAM)nmh.idFrom,(LPARAM)&nmh);
不知道该用在何处……

用mouse_event不能后台吧?所以要用sendmessage,但是没实现,
请高手指教啊
...全文
1304 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
cuteair 2011-05-06
  • 打赏
  • 举报
回复
还是没有解决,但是4楼开阔了我的视野,分给你吧
Sou2012 2011-04-22
  • 打赏
  • 举报
回复
这个可以使用编写驱动来完成。
cuteair 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 alweeq86 的回复:]

C/C++ code

::PostMessage(j2,WM_LBUTTONDBCLICK,1,17+34*65536);//坐标是用spy++看真是鼠标双击得出来的第一行某点的坐标
SendMessage(hWnd,WM_LBUTTONDBCLICK,NULL,(y<<16)+x);//这里x,y是坐标
[/Quote]
我这个算法效果是一样的,都是把Y坐标移到高位
alweeq86 2011-04-22
  • 打赏
  • 举报
回复

::PostMessage(j2,WM_LBUTTONDBCLICK,1,17+34*65536);//坐标是用spy++看真是鼠标双击得出来的第一行某点的坐标
SendMessage(hWnd,WM_LBUTTONDBCLICK,NULL,(y<<16)+x);//这里x,y是坐标
cuteair 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lactoferrin 的回复:]

你如何得到j2
[/Quote]
findwindow
findwindowex
cuteair 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 ilysony 的回复:]

这个可以使用编写驱动来完成。
[/Quote]
这个是我没碰到过的方法,愿闻其详
请问大约是怎么个思路
Lactoferrin 2011-04-21
  • 打赏
  • 举报
回复
你如何得到j2
cuteair 2011-04-21
  • 打赏
  • 举报
回复
J2是要发送到的控件句柄
Lactoferrin 2011-04-20
  • 打赏
  • 举报
回复
你的j2是什么
cuteair 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lactoferrin 的回复:]

这个应该用SendInput或mouse_event
[/Quote]
大体看了一下
貌似他也是用MOUSE_EVENT
我要崩溃了……
cuteair 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lactoferrin 的回复:]

这个应该用SendInput或mouse_event
[/Quote]
这两个不行,需要后台
Lactoferrin 2011-04-20
  • 打赏
  • 举报
回复
这个应该用SendInput或mouse_event
cuteair 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhao4zhong1 的回复:]

参考AutoHotKey源代码http://www.autohotkey.com
[/Quote]
这个东西真好玩啊,好好研究一下
cuteair 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhoutanliang 的回复:]

引用 2 楼 cuteair 的回复:

引用楼主 cuteair 的回复:
我要用程序实现后台模拟鼠标双击其他程序的listview32中的item用
::PostMessage(j2,WM_LBUTTONDOWN,1,17+34*65536);//坐标是用spy++看真是鼠标双击得出来的第一行某点的坐标
::PostMessage(j2,WM_LBUTTONUP,NULL,17+3……
[/Quote]
谢谢,我再找找方法,看到有人成功了但是没说怎么成功的
赵4老师 2011-04-20
  • 打赏
  • 举报
回复
参考AutoHotKey源代码http://www.autohotkey.com
AlanBruce 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cuteair 的回复:]

引用楼主 cuteair 的回复:
我要用程序实现后台模拟鼠标双击其他程序的listview32中的item用
::PostMessage(j2,WM_LBUTTONDOWN,1,17+34*65536);//坐标是用spy++看真是鼠标双击得出来的第一行某点的坐标
::PostMessage(j2,WM_LBUTTONUP,NULL,17+34*65536);
::PostMessag……
[/Quote]

事件的原理是捕获,你的问题属于仿真双击

可能这个办法是不行的
cuteair 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 cuteair 的回复:]
我要用程序实现后台模拟鼠标双击其他程序的listview32中的item用
::PostMessage(j2,WM_LBUTTONDOWN,1,17+34*65536);//坐标是用spy++看真是鼠标双击得出来的第一行某点的坐标
::PostMessage(j2,WM_LBUTTONUP,NULL,17+34*65536);
::PostMessage(j2,WM_LBUT……
[/Quote]
是这样的吗:
::PostMessage(j1,WM_NOTIFY,(WPARAM)nmh.idFrom,(LPARAM)&nmh);
::PostMessage(j2,WM_LBUTTONDBLCLK,1,17+34*65536);

木有效果……
现在我发现如果向一个EDIT控件只发送一个WM_LBUTTONDBLCLK的话,我必须用鼠标手动去点一下这个控件才会触发双击事件,不知道是为什么
AlanBruce 2011-04-20
  • 打赏
  • 举报
回复
sendmessage是同步的

PostMessage是异步信号发送


NMHDR nmh;
nmh.code = NM_DBLCLK; // Message type defined by control.
nmh.idFrom = ::GetDlgCtrlID(j2);
nmh.hwndFrom = j2;
::SendMessage(j1,WM_NOTIFY,(WPARAM)nmh.idFrom,(LPARAM)&nmh);


这一段放在双击事件之前
第9章 Windows相关技术 337 9.1 磁盘信息 338 0520 获取驱动器的卷标 338 0521 检测软驱是否有软盘 339 0522 判断是否插入存储器 339 0523 判断光驱是否有光盘 339 0524 判断驱动器类型 340 0525 获取磁盘序列号 341 0526 获取磁盘空间信息 342 9.2 磁盘操作 343 0527 格式化磁盘 343 0528 关闭磁盘共享 343 0529 设置磁盘卷标 343 0530 磁盘碎片整理 344 0531 从FAT32转换为NTFS 344 0532 隐藏磁盘分区 345 0533 显示被隐藏的磁盘分区 345 0534 如何更改分区号 346 0535 如何监视硬盘 346 9.3 系统控制与调用 347 0536 调用外部程序的方法 347 0537 调用创建快捷方式向导 348 0538 访问启动控制面板中的各项 348 0539 控制光驱的弹开与关闭 349 0540 实现关闭、重启和注销计算机 349 0541 关闭和打开显示器 350 0542 打开和关闭屏幕保护 350 0543 关闭当前输入法 350 0544 程序发出提示音 351 0545 列举系统中的可执行文件 351 9.4 应用程序操作 352 0546 如何确定应用程序没有响应 352 0547 检索任务管理器中的任务列表 353 0548 判断某个程序是否运行 353 0549 设计具有插件功能的应用程序 355 0550 怎样在程序中执行DOS命令 359 0551 修改其他进程中窗口的标题 359 0552 如何设计换肤程序 360 0553 PE档案格式分析 364 0554 修改应用程序图标 365 0555 列举应用程序使用的dll文件 368 0556 调用具有命令行参数的应用程序 369 0557 在程序中调用一个子进程直到其结束 371 0558 提取并保存应用程序图标 371 9.5 系统工具 373 0559 为程序添加快捷方式 373 0560 用列表显示系统正在运行的程序 375 0561 如何获得毫秒级时间 376 0562 注册和卸载组件 376 0563 清空回收站 377 0564 如何在程序中显示文件属性对话框 377 9.6 桌面相关 377 0565 隐藏和显示桌面文件 377 0566 隐藏和显示开始按钮 378 0567 隐藏和显示Windows任务栏 378 0568 判断屏幕保护程序是否在运行 379 0569 判断系统是否使用大字体 379 0570 获取任务栏属性 379 0571 获取任务栏窗口句柄 379 0572 隐藏任务栏时钟 380 0573 改变桌面背景颜色 380 0574 获取桌面列表视图句柄 380 9.7 系统信息 380 0575 获取CPU ID值 380 0576 获取CPU时钟频率 381 0577 获得Windows和System的路径 381 0578 获取特殊文件夹路径 382 0579 检测系统启动模式 382 0580 判断操作系统类型 383 0581 获取当前系统的运行时间 383 0582 如何获取Windows 2000系统启动时间 384 0583 获取处理器信息 385 0584 通过内存映射实现传送数据 385 0585 检测是否安装声卡 387 0586 获取当前用户名 387 0587 获取系统环境变量 387 0588 修改计算机名称 388 0589 获取当前屏幕颜色质量 388 0590 获得当前屏幕的分辨率 388 9.8 进程与线程 389 0591 如何使用TLS 389 0592 创建线程 389 0593 创建用户界面线程 390 0594 终止线程的方法 390 0595 使进程处于睡眠状态 391 0596 启动记事本并控制其关闭 391 0597 创建闪屏线程 392 0598 利用互斥对象实现线程同步 393 0599 利用临界区实现线程同步 395 0600 利用事件对象实现线程同步 396 0601 用信号量实现线程同步 398 0602 挂起系统 399 0603 调用记事本程序并暂停其运行 399 0604 等待打开的记事本程序关闭 400 0605 禁止程序重复运行 400 0606 在Visual C++与Delphi间实现对象共享 401 9.9 消息 402 0607 如何自定义消息 402 0608 如何向Windows注册消息 402 0609 PostMessageSendMessage函数的区别 402 0610 利用WM_COPYDATA消息实现进程间数据传递 403 9.10 剪贴板 404 0611 列举剪贴板中数据类型 404 0612 监视剪贴板复制过的内容 405 0613 通过剪贴板传递全局数据 406 9.11 鼠标键盘 407 0614 交换鼠标左右键 407 0615 设置鼠标双击的时间间隔 407 0616 获得鼠标键数 407 0617 获取鼠标下窗体句柄 407 0618 模拟鼠标单击按钮 409 0619 在程序中添加快捷键 410 0620 在对话框中使用加速键 411 0621 处理鼠标滚轮消息 411 0622 获取键盘按键 412 0623 获取键盘类型及功能号 412 0624 控制键盘指示灯 413 9.12 动态链接库与钩子 414 0625 从动态库中获取位图资源 414 0626 屏蔽键盘POWER键 415 0627 屏蔽键盘WIN键 415 0628 禁止使用 Alt+F4 键来关闭窗体 416 0629 枚举模块中的所有图标 417 0630 使用模块对话框资源 418 0631 替换应用程序中对话框资源 419 0632 可导出的动态链接库函数 420 0633 动态链接库动态加载 420
第9章 Windows相关技术 337 9.1 磁盘信息 338 0520 获取驱动器的卷标 338 0521 检测软驱是否有软盘 339 0522 判断是否插入存储器 339 0523 判断光驱是否有光盘 339 0524 判断驱动器类型 340 0525 获取磁盘序列号 341 0526 获取磁盘空间信息 342 9.2 磁盘操作 343 0527 格式化磁盘 343 0528 关闭磁盘共享 343 0529 设置磁盘卷标 343 0530 磁盘碎片整理 344 0531 从FAT32转换为NTFS 344 0532 隐藏磁盘分区 345 0533 显示被隐藏的磁盘分区 345 0534 如何更改分区号 346 0535 如何监视硬盘 346 9.3 系统控制与调用 347 0536 调用外部程序的方法 347 0537 调用创建快捷方式向导 348 0538 访问启动控制面板中的各项 348 0539 控制光驱的弹开与关闭 349 0540 实现关闭、重启和注销计算机 349 0541 关闭和打开显示器 350 0542 打开和关闭屏幕保护 350 0543 关闭当前输入法 350 0544 程序发出提示音 351 0545 列举系统中的可执行文件 351 9.4 应用程序操作 352 0546 如何确定应用程序没有响应 352 0547 检索任务管理器中的任务列表 353 0548 判断某个程序是否运行 353 0549 设计具有插件功能的应用程序 355 0550 怎样在程序中执行DOS命令 359 0551 修改其他进程中窗口的标题 359 0552 如何设计换肤程序 360 0553 PE档案格式分析 364 0554 修改应用程序图标 365 0555 列举应用程序使用的dll文件 368 0556 调用具有命令行参数的应用程序 369 0557 在程序中调用一个子进程直到其结束 371 0558 提取并保存应用程序图标 371 9.5 系统工具 373 0559 为程序添加快捷方式 373 0560 用列表显示系统正在运行的程序 375 0561 如何获得毫秒级时间 376 0562 注册和卸载组件 376 0563 清空回收站 377 0564 如何在程序中显示文件属性对话框 377 9.6 桌面相关 377 0565 隐藏和显示桌面文件 377 0566 隐藏和显示开始按钮 378 0567 隐藏和显示Windows任务栏 378 0568 判断屏幕保护程序是否在运行 379 0569 判断系统是否使用大字体 379 0570 获取任务栏属性 379 0571 获取任务栏窗口句柄 379 0572 隐藏任务栏时钟 380 0573 改变桌面背景颜色 380 0574 获取桌面列表视图句柄 380 9.7 系统信息 380 0575 获取CPU ID值 380 0576 获取CPU时钟频率 381 0577 获得Windows和System的路径 381 0578 获取特殊文件夹路径 382 0579 检测系统启动模式 382 0580 判断操作系统类型 383 0581 获取当前系统的运行时间 383 0582 如何获取Windows 2000系统启动时间 384 0583 获取处理器信息 385 0584 通过内存映射实现传送数据 385 0585 检测是否安装声卡 387 0586 获取当前用户名 387 0587 获取系统环境变量 387 0588 修改计算机名称 388 0589 获取当前屏幕颜色质量 388 0590 获得当前屏幕的分辨率 388 9.8 进程与线程 389 0591 如何使用TLS 389 0592 创建线程 389 0593 创建用户界面线程 390 0594 终止线程的方法 390 0595 使进程处于睡眠状态 391 0596 启动记事本并控制其关闭 391 0597 创建闪屏线程 392 0598 利用互斥对象实现线程同步 393 0599 利用临界区实现线程同步 395 0600 利用事件对象实现线程同步 396 0601 用信号量实现线程同步 398 0602 挂起系统 399 0603 调用记事本程序并暂停其运行 399 0604 等待打开的记事本程序关闭 400 0605 禁止程序重复运行 400 0606 在Visual C++与Delphi间实现对象共享 401 9.9 消息 402 0607 如何自定义消息 402 0608 如何向Windows注册消息 402 0609 PostMessageSendMessage函数的区别 402 0610 利用WM_COPYDATA消息实现进程间数据传递 403 9.10 剪贴板 404 0611 列举剪贴板中数据类型 404 0612 监视剪贴板复制过的内容 405 0613 通过剪贴板传递全局数据 406 9.11 鼠标键盘 407 0614 交换鼠标左右键 407 0615 设置鼠标双击的时间间隔 407 0616 获得鼠标键数 407 0617 获取鼠标下窗体句柄 407 0618 模拟鼠标单击按钮 409 0619 在程序中添加快捷键 410 0620 在对话框中使用加速键 411 0621 处理鼠标滚轮消息 411 0622 获取键盘按键 412 0623 获取键盘类型及功能号 412 0624 控制键盘指示灯 413 9.12 动态链接库与钩子 414 0625 从动态库中获取位图资源 414 0626 屏蔽键盘POWER键 415 0627 屏蔽键盘WIN键 415 0628 禁止使用 Alt+F4 键来关闭窗体 416 0629 枚举模块中的所有图标 417 0630 使用模块对话框资源 418 0631 替换应用程序中对话框资源 419 0632 可导出的动态链接库函数 420 0633 动态链接库动态加载 420
API之网络函数1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一个网络连接 WNetCancelConnection2 结束一个网络连接 WNetCloseEnum 结束一次枚举操作 WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接 WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接 WNetEnumResource 枚举网络资源 WNetGetConnection 获取本地或已连接的一个资源的网络名称 WNetGetLastError 获取网络错误的扩展错误信息 WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC(统一命名规范)名称 WNetGetUser 获取一个网络资源用以连接的名字 WNetOpenEnum 启动对网络资源进行枚举的过程 2. API之消息函数 BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口 GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置 GetMessageTime 取得消息队列中上一条消息处理完毕时的时间 PostMessage 将一条消息投递到指定窗口的消息队列 PostThreadMessage 将一条消息投递给应用程序 RegisterWindowMessage 获取分配给一个字串标识符的消息编号 ReplyMessage 答复一个消息 SendMessage 调用一个窗口的窗口函数,将一条消息发给那个窗口 SendMessageCallback 将一条消息发给窗口 SendMessageTimeout 向窗口发送一条消息 SendNotifyMessage 向窗口发送一条消息 3. API之文件处理函数 CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等 CompareFileTime 对比两个文件的时间 CopyFile 复制文件 CreateDirectory 创建一个新目录 CreateFile 打开和创建文件、管道、邮槽、通信服务、设备以及控制台 CreateFileMapping 创建一个新的文件映射对象 DeleteFile 删除指定文件 DeviceIoControl 对设备执行指定的操作 DosDateTimeToFileTime 将DOS日期和时间值转换成一个 win32 FILETIME 值 FileTimeToDosDateTime 将一个 win32 FILETIME 值转换成DOS日期和时间值 FileTimeToLocalFileTime 将一个FILETIME结构转换成本地时间 FileTimeToSystemTime 根据一个FILETIME结构的内容,装载一个SYSTEMTIME结构 FindClose 关闭由FindFirstFile函数创建的一个搜索句柄 FindFirstFile 根据文件名查找文件 FindNextFile 根据调用FindFirstFile函数时指定的一个文件名查找下一个文件 FlushFileBuffers 针对指定的文件句柄,刷新内部文件缓冲区 FlushViewOfFile 将写入文件映射缓冲区的所有数据都刷新到磁盘 GetBinaryType 判断文件是否可以执行 GetCompressedFileSize 判断一个压缩文件在磁盘上实际占据的字节数 GetCurrentDirectory 在一个缓冲区中装载当前目录 GetDiskFreeSpace 获取与一个磁盘的组织有关的信息,以及了解剩余空间的容量 GetDiskFreeSpaceEx 获取与一个磁盘的组织以及剩余空间容量有关的信息 GetDriveType 判断一个磁盘驱动器的类型 GetExpandedName 取得一个压缩文件的全名 GetFileAttributes 判断指定文件的属性 GetFileInformationByHandle 这个函数提供了获取文件信息的一种机制 GetFileSize 判断文件长度 GetFileTime 取得指定文件的时间信息 GetFileType 在给出文件句柄的前提下,判断文件类型 GetFileVersionInfo 从支持版本标记的一个模块里获取文件版本信息

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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