模拟键盘ctrl+鼠标滚轮操作,放大缩小Word文档内容

timerbaby 2011-09-14 03:29:56
在Word界面下,按下Ctrl键,再按鼠标的滚轮,就可以放大缩小文档内容
现在要模拟这个操作,在后台发命令,控制前台的word放大缩小。

如果不加Key的代码,滚轮可以控制word文档上下滚动。加了Key的代码以后,滚轮的代码不起作用。这个时候,拨动鼠标的滚轮,可以放大缩小,说明这个时候,ctrl键是按下的。

为什么加了键盘按键后,滚轮的代码就不好用了呢?

代码如下:

INPUT MouseInputs = {0};
INPUT KeyInputs = {0};
//key
KeyInputs.type = INPUT_KEYBOARD;
KeyInputs.ki.wVk = VK_CONTROL ;
SendInput(1,&KeyInputs,sizeof(KeyInputs));
//mouse wheel
MouseInputs.type = INPUT_MOUSE;
MouseInputs.mi.dx = lpPoint.x;
MouseInputs.mi.dy = lpPoint.y;
MouseInputs.mi.dwFlags = MOUSEEVENTF_WHEEL;
MouseInputs.mi.mouseData = 100;
SendInput(1,&MouseInputs,sizeof(MouseInputs));
...全文
1697 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuhong504243048 2011-12-28
  • 打赏
  • 举报
回复
我的QQ邮箱504243048@qq.com
yuhong504243048 2011-12-28
  • 打赏
  • 举报
回复
你可不可以把你的文档放大缩小的项目给我看下啊
timerbaby 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 fenshucangku 的回复:]
明白了,鼠标滚动的最小单位是WHEEL_DELTA,这个值得定义是120
正确的写法应该是mouse_event(MOUSEEVENTF_WHEEL, 0, 0, WHEEL_DELTA乘以个数, 0);
[/Quote]

哇塞!还是您厉害!高杆!PFPF,回答的太晚了,不然100分都给你了,呵呵
fenshucangku 2011-09-14
  • 打赏
  • 举报
回复
明白了,鼠标滚动的最小单位是WHEEL_DELTA,这个值得定义是120
正确的写法应该是mouse_event(MOUSEEVENTF_WHEEL, 0, 0, WHEEL_DELTA乘以个数, 0);
fenshucangku 2011-09-14
  • 打赏
  • 举报
回复
mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 200, 0);
//mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 100, 0);

这样也是可以的,说明是不是100的滚动值太小了,word没处理?
fenshucangku 2011-09-14
  • 打赏
  • 举报
回复
review不怕不通过,写上注释就行了,谁不服气谁来改个调用一次的版本
这个问题很奇怪,真的很奇怪,可能和word的处理有关系吧
timerbaby 2011-09-14
  • 打赏
  • 举报
回复
我自己解决了。
但我不知道为什么是这样的。
其实很简单,发两次mouse_event(是无意识中发现,呵呵)

keybd_event(VK_CONTROL,0,0,0);
mouse_event( MOUSEEVENTF_WHEEL , lpPoint.x , lpPoint.y , 100 , 0 ) ;
//要发两次,就好用了。奇怪吧。是我复制后粘贴在错误的位置,结果,成功了!嘿嘿,人品啊!
mouse_event( MOUSEEVENTF_WHEEL , lpPoint.x , lpPoint.y , 100 , 0 ) ;

虽然问题解决了,但为什么呢?这样的代码,review的时候,也不好通过啊!
jacky_qiu 2011-09-14
  • 打赏
  • 举报
回复
可以在工具栏(或菜单)找打放大缩小的命令,然后打开spy++ ,查看按“放大”或“缩小”命令时,主窗口(或其他窗口)接收到的WM_COMMAND命令是怎样的。
再之后跟着用SendMessage(hWnd,WM_COMMAND,...,...) 应该就可以了。
纯理论,没测试过word,但其他软件用这种方法都可以实现。
timerbaby 2011-09-14
  • 打赏
  • 举报
回复
没人了解这个吗?
timerbaby 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fenshucangku 的回复:]
http://lishaoan77.blog.163.com/blog/static/65087394201061210745866/
[/Quote]

只能上CSDN的无奈
timerbaby 2011-09-14
  • 打赏
  • 举报
回复
mouse_event( MOUSEEVENTF_WHEEL , lpPoint.x , lpPoint.y , 100 , 0 ) ;

试验过了,现象一样的
fenshucangku 2011-09-14
  • 打赏
  • 举报
回复
http://lishaoan77.blog.163.com/blog/static/65087394201061210745866/
fenshucangku 2011-09-14
  • 打赏
  • 举报
回复
再加上mouse_event模拟鼠标,就可以了
fenshucangku 2011-09-14
  • 打赏
  • 举报
回复
用keybd_event吧

16,472

社区成员

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

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

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