真的希望第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);
高手救命

解决方案 »

  1.   

    PreTranslateMessage 是截不到 SendMessage 的
      

  2.   

    4.我怎么知道消息被成功执行?
    SendMessage就是消息被执行了才返回的。
      

  3.   

    SendMessage有返回值的
    根据值来判断执行成功与否
      

  4.   

    3.一直想用SendMessage 发送 WM_KEYDOWN消息,但是一直不成功,这是为什么?
    因为WM_KEYDOWN并没有被Translate,所以你看不到效果
    4.不同的具体消息具体处理,一般是根据返回值判断
      

  5.   

    3. 应该发送 WM_CHAR 消息。
      

  6.   

    回复人: goodboyws(深夜不眠者) ( ) 信誉:134  2005-09-04 16:26:00  得分: 0     3.一直想用SendMessage 发送 WM_KEYDOWN消息,但是一直不成功,这是为什么?
    因为WM_KEYDOWN并没有被Translate,所以你看不到效果
    -----------------------------------------------------------
    那WM_KEYDOWN该怎样被Translate 呢?谢谢
      
     
      

  7.   

    前段代码 应该是较好的方法, 只是需要保证顺序。可以在 SendMessage之前调用WaitForInputIdle来确保键盘消息已经被处理了。后段代码并不总是在所有情况下都能起作用。比如在直接读取键盘状态的程序中该键盘模拟操作就完全无效。
    不过对于一般的字符输入界面应该是可以的。
    不过lParam 的取值 和我机器上的不一样, 恕我偷懒,不去验证了, 只把我Spy到的lParam给你参考一下。
    WM_KEYDOWN:  0X00010001
    WM_KEYUP: 0XC0010001用Spy可以看到在这两个消息之间,翻译了一个 WM_CHAR消息:
    WM_CHAR: 0X00010001你可以用Spy验证一下你的SendMessage是否成功。
      

  8.   

    回复人: whoo(谁) ( ) 信誉:105  2005-09-05 11:32:00  得分: 0  
     ------------------------------------------WaitForInputIdle该怎么用啊 ~好象WaitForInputIdle也不能解决问题
    还是 还是先执行sendmessage的内容,再模拟安键啊
      

  9.   

    注意一下WaitForInputIdle 用的是进程句柄,不是一般的窗口句柄。进程句柄可以通过OpenProcess(,,进程ID)来获得。进程ID可以通过GetCurrentProcessId辅助进程间消息通讯来获得。或者简单点用 EnumProcess 来获得。
      

  10.   

    我用GetCurrentProcess函数得到当前进程句柄,然后用将值传入WaitForInputIdle,
    这样可以不?
      

  11.   

    当然不行,需要目标进程的 进程句柄。HWND =(GetWindowThreadProcessId)=> PROCESS ID =(OpenProcess)=> PROCESS HANDLE