如何用SendMessage向另一个窗口发送Alt的组合消息(如Alt + E)

natasha 2003-12-17 07:36:40
不要说Keybd_event,这个我也会.

找了很多资料,试下来都不行.
...全文
166 点赞 收藏 24
写回复
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
natasha 2003-12-27
Button1Click
SetForegroundWindow(HWindow);
PostMessage(HWindow, WM_SYSCOMMAND, SC_KEYMENU, (WPARAM)'E');

可是点击按钮的时候,有时候可以激活,有时候不行,大概三次才能激活一次,这是怎么回事啊?
回复
csd08 2003-12-26
NetLinux(笑天-www.laughsky.com)的方法多加一句
ShowWindow(hwin,SW_RESTORE); //如果窗体最小化,则正常显示之
就更加完善了。
PS 这个方法我也想过,就是这个参数 (WPARAM)0x45我设置的不对,不知这是如何计算出来的?
回复
COpyFRee 2003-12-26

没有必要控件窗体的显示状态,ccrun(老妖) 的足可以了……
回复
ccrun.com 2003-12-26
用不着费神去计算。直接这样就可以了:

SendMessage(hwin, WM_SYSCOMMAND, SC_KEYMENU , (WPARAM)'f'); // alt + f

SendMessage(hwin, WM_SYSCOMMAND, SC_KEYMENU , (WPARAM)'v'); // alt + v

以此类推。
回复
字母A 十六进制是 41,
字母B 十六进制是 42,
字母C 十六进制是 43,
字母D 十六进制是 44,
.....
回复
在win 2000 的附件,系统工具中有个字符映射表程序,在这里单击字母,在下面状态栏中就会出现16进制的值。
98我已经记不的了。

在CB的程序中是这样做的。:
相应 OnKeyUp事件。
void __fastcall TForm1::Button3KeyUp(TObject *Sender, WORD &Key,
TShiftState Shift)
{
ShowMessage(Key); //这里显示的是十进制。把它专为十六进制就行了。
}
回复
woodwoodwood3 2003-12-25
楼主的意思不大明白,特殊窗口不知是什么窗口,游戏窗口?如果是要使用钩子函数啦!而且必须将发送消息的函数放在钩子里面,必须是全局的DLL钩子!这样就没有不能截获的窗口了。试试吧!
回复
这一下行了吧。

HWND hwin = FindWindow(NULL, "Calculator");
if (hwin != NULL)
{
SetForegroundWindow(hwin);
SendMessage(hwin, WM_SYSCOMMAND, SC_KEYMENU , (WPARAM)0x45);
}
回复
natasha 2003-12-23
to losthold(呵呵):
我用SendMessage(HWin, WM_IME_CHAR, 'A', 0);其中HWin就是记事本窗口的句柄啊。这句是可以执行的啊。
回复
losthold 2003-12-23
必须为SendMessage函数指定可以具有输入焦点的控件句柄
比如说记事本,直接为SendMessage函数指定记事本窗口的句柄是没有用的
必须为SendMessage函数指定记事本的Edit控件的句柄。
回复
我来收分了。
ALT, //字符十六进制 F
SendMessage(Handle, WM_SYSCOMMAND, SC_KEYMENU, (WPARAM)0x46);
回复
yjy1001 2003-12-23
才上来,刚看到你的短信

我觉得 应该可以通过调用 设置系统热键消息,然后再发送系统热键消息 来达到传递的目的

最近好忙 —— 年终 —— 年度总结! 好多项目要收尾!

所以没时间帮你测试。

不好意思,帮不上忙
回复
nobill 2003-12-23
顶@!
回复
natasha 2003-12-22
晕。keybd_event和SendInput我都知道。但是对某些特殊状态的窗体,keybd_event和sendinput都不行。
这里的特殊状态当然包括最小化,但是我遇到了某些窗体,正常状态下我还是不能发送alt的组合键,普通字符按键是可以发送的。
所以我想用Sendmessage试试,但是查找的关于sendmessage关于alt组合键的代码都不能正常运行。
回复
ccrun.com 2003-12-22
楼主都说了不让用Keybd_event的。呵呵。
回复
csd08 2003-12-22
to natasha(月不常满) :
再次为我先前的误解表示抱歉,以下是我测试通过的代码,希望能对你有点帮助。


AnsiString WindowName = "计算器";
HWND hwin = FindWindow(NULL, WindowName.c_str());
ShowWindow(hwin,SW_RESTORE); //如果窗体最小化,则正常显示之
SetForegroundWindow(hwin); //将该窗体推到最前面显示(用SetActiveWindow不行)
//Alt key down
keybd_event( VK_MENU, MapVirtualKey( VK_MENU, 0 ), 0 , 0 );
//'E' key down
keybd_event( 'E', MapVirtualKey( 'E', 0 ), 0 , 0 );
//'E' key up
keybd_event( 'E', MapVirtualKey( 'E', 0 ), KEYEVENTF_KEYUP , 0 );
//Alt key up
keybd_event( VK_MENU, MapVirtualKey( VK_MENU, 0 ), KEYEVENTF_KEYUP , 0 );


回复
loki2k 2003-12-18
窗口不在任务栏,FindWindow函数返回NULL.
回复
natasha 2003-12-18
大哥不行啊.
Button1的Click事件里
AnsiString WindowName = "计算器";
int hwin = FindWindow(null, WindowName.c_str());
if (hwin != 0)
{
PostMessage(hWin, WM_KEYDOWN, VK_MENU, 0);
PostMessage(hWin, WM_SYSKEYDOWN, 'E', 0);
PostMessage(hWin, WM_KEYUP, VK_MENU, 0);
PostMessage(hWin, WM_SYSKEYUP, 'E', 0);
}
回复
ccrun.com 2003-12-18
PostMessage(hWin, WM_KEYDOWN, VK_MENU, 0);
PostMessage(hWin, WM_SYSKEYDOWN, 'E', 0);
PostMessage(hWin, WM_KEYUP, VK_MENU, 0);
PostMessage(hWin, WM_SYSKEYUP, 'E', 0);
回复
natasha 2003-12-18
晕...
to loki2k(loki):
我当然运行了'计算器',而且没有最小化!!
这里不是findwindow的问题,而是模拟不出消息..
to csd08(jone):
我是要把菜单选出,而不是发送字符~~~~~~~~~~~~~
hwin定义类型错了,应该是HWND,写的时候写错了.我程序里是对的.
回复
发动态
发帖子
Windows SDK/API
创建于2007-08-02

1202

社区成员

C++ Builder Windows SDK/API
申请成为版主
社区公告
暂无公告