由MSDN:The message is posted/send 所想到的几个关于消息的问题~问题多多~~高人请解答!!!

zkk520777 2005-09-04 02:49:11
真的希望第3 第4个问题得到解答,已经困扰我好久了 真难受~~
谢谢

The WM_KEYDOWN message is posted to the window………
The WM_CREATE message is sent when ………
1.post/send 这是不是Windows 默认 处理它们的形式?
2.是否注释为post 的 消息就不能用 send,注释为send的就不能用post ?
如果怎样用 岂不是和windows的原理 相矛盾?
3.一直想用SendMessage 发送 WM_KEYDOWN消息,但是一直不成功,这是为什么?
如果你们有 成功的例子能否给我发一份^_^
4.我怎么知道消息被成功执行?所谓的PreTranslateMessage 和HOOK都是在消息执行前
拦截,我需要的是在消息成功执行后,得到成功执行的状态,再执行下一条语句~

附代码 :我要在 模拟执行按键后 再执行SendMessage~~但以下代码不能实现
期待高人解答
code:
我需要的是先模拟按键成功执行之后,再执行SendMessage中的COPYDATA里的命令
adsw_acadMainWnd()得到为 CAD 的主窗口
但以下段代码产生的结果是 先执行的SendMessage 再模拟按键。
::keybd_event( VK_ESCAPE, 0, 0, 0);
::keybd_event( VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0);//用POSTMESSAGE产生一样的效果
COPYDATASTRUCT cmdMsg;
.........
::SendMessage(adsw_acadMainWnd(),
WM_COPYDATA,
(WPARAM)adsw_acadMainWnd(),
(LPARAM)&cmdMsg);
而以下段代码产生的结果是 不响应模拟按键。
::SendMessage(adsw_acadMainWnd(),
WM_KEYDOWN,
VK_ESCAPE,
0x001c0001);
::SendMessage(adsw_acadMainWnd(),
WM_KEYUP,
VK_ESCAPE,
0xc01c0001);
COPYDATASTRUCT cmdMsg;
....
::SendMessage(adsw_acadMainWnd(),
WM_COPYDATA,
(WPARAM)adsw_acadMainWnd(),
(LPARAM)&cmdMsg);
高手救命

...全文
173 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zkk520777 2005-09-12
  • 打赏
  • 举报
回复
还是 不行啊。。。
算了。。
whoo 2005-09-07
  • 打赏
  • 举报
回复
当然不行,需要目标进程的 进程句柄。

HWND =(GetWindowThreadProcessId)=> PROCESS ID =(OpenProcess)=> PROCESS HANDLE
whoo 2005-09-06
  • 打赏
  • 举报
回复
注意一下WaitForInputIdle 用的是进程句柄,不是一般的窗口句柄。

进程句柄可以通过OpenProcess(,,进程ID)来获得。

进程ID可以通过GetCurrentProcessId辅助进程间消息通讯来获得。

或者简单点用 EnumProcess 来获得。
zkk520777 2005-09-06
  • 打赏
  • 举报
回复
我用GetCurrentProcess函数得到当前进程句柄,然后用将值传入WaitForInputIdle,
这样可以不?
zkk520777 2005-09-05
  • 打赏
  • 举报
回复
谢谢~~~~
whoo 2005-09-05
  • 打赏
  • 举报
回复
前段代码 应该是较好的方法, 只是需要保证顺序。可以在 SendMessage之前调用WaitForInputIdle来确保键盘消息已经被处理了。

后段代码并不总是在所有情况下都能起作用。比如在直接读取键盘状态的程序中该键盘模拟操作就完全无效。
不过对于一般的字符输入界面应该是可以的。
不过lParam 的取值 和我机器上的不一样, 恕我偷懒,不去验证了, 只把我Spy到的lParam给你参考一下。
WM_KEYDOWN: 0X00010001
WM_KEYUP: 0XC0010001

用Spy可以看到在这两个消息之间,翻译了一个 WM_CHAR消息:
WM_CHAR: 0X00010001

你可以用Spy验证一下你的SendMessage是否成功。



zkk520777 2005-09-05
  • 打赏
  • 举报
回复
沉了
zkk520777 2005-09-05
  • 打赏
  • 举报
回复
回复人: whoo(谁) ( ) 信誉:105 2005-09-05 11:32:00 得分: 0
------------------------------------------

WaitForInputIdle该怎么用啊 ~好象WaitForInputIdle也不能解决问题
还是 还是先执行sendmessage的内容,再模拟安键啊
zkk520777 2005-09-04
  • 打赏
  • 举报
回复
高手现身啊~~
zkk520777 2005-09-04
  • 打赏
  • 举报
回复
回复人: goodboyws(深夜不眠者) ( ) 信誉:134 2005-09-04 16:26:00 得分: 0

3.一直想用SendMessage 发送 WM_KEYDOWN消息,但是一直不成功,这是为什么?
因为WM_KEYDOWN并没有被Translate,所以你看不到效果
-----------------------------------------------------------
那WM_KEYDOWN该怎样被Translate 呢?谢谢


goodname008 2005-09-04
  • 打赏
  • 举报
回复
3. 应该发送 WM_CHAR 消息。
goodboyws 2005-09-04
  • 打赏
  • 举报
回复
3.一直想用SendMessage 发送 WM_KEYDOWN消息,但是一直不成功,这是为什么?
因为WM_KEYDOWN并没有被Translate,所以你看不到效果
4.不同的具体消息具体处理,一般是根据返回值判断
lipeipei 2005-09-04
  • 打赏
  • 举报
回复
SendMessage有返回值的
根据值来判断执行成功与否
dirdirdir3 2005-09-04
  • 打赏
  • 举报
回复
4.我怎么知道消息被成功执行?
SendMessage就是消息被执行了才返回的。
vcmute 2005-09-04
  • 打赏
  • 举报
回复
PreTranslateMessage 是截不到 SendMessage 的

16,471

社区成员

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

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

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