| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1619 人关注过本帖
标题:想对后台的记事本发送 Alt+E(打开编辑菜单),但一直不能成功
只看楼主 加入收藏
richardw
Rank: 2
等 级:论坛游民
威 望:1
帖 子:12
专家分:14
注 册:2014-9-7
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:10 
想对后台的记事本发送 Alt+E(打开编辑菜单),但一直不能成功
前台的很好办,直接
SetForegroundWindow(m_hWnd);
SendMessage(m_hWnd, WM_SYSCOMMAND, SC_KEYMENU, (WPARAM)'E');
就可以,但不置前窗体的话,怎么发过去让记事本打开编辑菜单呢?
搜索更多相关主题的帖子: 记事本 前台 
2014-09-07 16:33
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:1 
SendMessage(m_hWnd, WM_SYSCOMMAND, SC_KEYMENU, (WPARAM)'E'); ‘E’这样不行吧,要找到键盘码才行的

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2014-09-07 19:02
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
应该有个key_event的,可以查询试试

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2014-09-07 19:07
stop1204
Rank: 9Rank: 9Rank: 9
来 自:福建省
等 级:贵宾
威 望:22
帖 子:295
专家分:1151
注 册:2013-9-8
收藏
得分:1 
Ascii
E = 69
e = 101

而且要将字符转换为键代码则要强制转换为int型
(int )'e'  or  (int )'E'

hl928452957@gmail点com

2014-09-08 08:55
richardw
Rank: 2
等 级:论坛游民
威 望:1
帖 子:12
专家分:14
注 册:2014-9-7
收藏
得分:0 
亲,先谢谢你对我的问题的关注,但你肯定没有试验吧,我原来发消息也这样子弄:
程序代码:
        PostMessage(m_hWnd, WM_SYSKEYDOWN, VK_MENU, MakeKeyLparam(VK_MENU, WM_SYSKEYDOWN)); 
        PostMessage(m_hWnd, WM_SYSKEYDOWN, 'E', MakeKeyLparam('E', WM_SYSKEYDOWN));         
        PostMessage(m_hWnd, WM_SYSCHAR, 'E', MakeKeyLparam('E', WM_SYSCHAR));               
        PostMessage(m_hWnd, WM_SYSKEYUP, 'E', MakeKeyLparam('E', WM_SYSKEYUP));             
        PostMessage(m_hWnd, WM_KEYUP, VK_MENU, MakeKeyLparam(VK_MENU, WM_KEYUP));           


但你试验一下就明白了,这些都不是关键,只要是有置前操作,就是把窗口搞成前台的SetForegroundWindow(m_hWnd);,那些都能成功

现在就是不知道如何给后台的程序发送成功

PS:keybd_event这些没句柄参数的,全都是给前台程序用的
2014-09-08 10:53
天使梦魔
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
收藏
得分:18 
如果是自己写的程序,方法多了,用共享内存,管道,等网上搜进程通信一大把
如果是未约定第三方程序,我就想到一个,钩子


SendMessage参数说明:
hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
2014-09-08 15:20
richardw
Rank: 2
等 级:论坛游民
威 望:1
帖 子:12
专家分:14
注 册:2014-9-7
收藏
得分:0 
发送的对像不是自己做的程序,也没有条件改变它。

我可以得到它的窗口句柄 ,可以向它发送单个的键,比如ALT、F10、ABC之类的,只要是单键,都能发过去(它在后台的时候)

用钩子应该怎么实现发组合键?能大概地说一下思路吗?对钩子用得不多呢,谢谢啦
2014-09-08 17:25
天使梦魔
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
收藏
得分:0 
如果单键能发送那组合键也可以。
hook技术还是算了,我突然想起来必须使用dll,就是通过向对方注入自己的dll达到控制目标进程的目的,发送,截拦,任意消息。

不过话说回来,到底是因为窗口不前置后导致不响应快捷键还是发送消息的问题?
看看函数返回是什么
2014-09-08 18:40
richardw
Rank: 2
等 级:论坛游民
威 望:1
帖 子:12
专家分:14
注 册:2014-9-7
收藏
得分:0 
单键可以,组合键还真不行。
就是一楼说的那个给后台记事本发消息的例子
SetForegroundWindow(m_hWnd);
SendMessage(m_hWnd, WM_SYSCOMMAND, SC_KEYMENU, (WPARAM)'E');

或者:
程序代码:
        SetForegroundWindow(m_hWnd);
        PostMessage(m_hWnd, WM_SYSKEYDOWN, VK_MENU, MakeKeyLparam(VK_MENU, WM_SYSKEYDOWN)); 
        PostMessage(m_hWnd, WM_SYSKEYDOWN, 'E', MakeKeyLparam('E', WM_SYSKEYDOWN));                       
        PostMessage(m_hWnd, WM_SYSKEYUP, 'E', MakeKeyLparam('E', WM_SYSKEYUP));             
        PostMessage(m_hWnd, WM_KEYUP, VK_MENU, MakeKeyLparam(VK_MENU, WM_KEYUP));  

都可以成功,如果把SetForegroundWindow取消,记事本是后台的话,这种组合键是发不成功的。

如果要给后台发单键,就很容易了,比如发F5(在记事本中添加当前时间)给后台记事本:
    PostMessage(m_hWnd, WM_KEYDOWN, VK_F5, MakeKeyLparam(VK_F5, WM_KEYDOWN));
    PostMessage(m_hWnd, WM_KEYUP, VK_F5, MakeKeyLparam(VK_F5, WM_KEYUP));


我原来也认为只要前台能发过去消息,后台也一样啦,结果一试,完全不是想像中的那回事。后台没反应呀

我用过全局或线程的HOOK,全都是DLL的,但都是一些很简单的应用,屏蔽、拦截或改键什么的

[ 本帖最后由 richardw 于 2014-9-8 21:38 编辑 ]
2014-09-08 21:36
richardw
Rank: 2
等 级:论坛游民
威 望:1
帖 子:12
专家分:14
注 册:2014-9-7
收藏
得分:0 
是因为因为窗口不前置后导致不响应快捷键

所有返回值都是1
2014-09-09 15:31
快速回复:想对后台的记事本发送 Alt+E(打开编辑菜单),但一直不能成功
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.043773 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved