Project1

标题: 【API】GetMessage的MSG结构如何处理? [打印本页]

作者: Defanive    时间: 2009-5-24 18:55
提示: 作者被禁止或删除 内容自动屏蔽
作者: 紫苏    时间: 2009-5-24 19:02
楼主怎么又来问这个问题了,之前不是回答过你了么?
http://rpg.blue/viewthread.php?tid=121902&ntime=2009%2D5%2D24+11%3A00%3A38

调用 GetMessage 之后,temp就成了整个结构体平坦后的数据数组,第一个元素是窗口句柄,第六个元素是消息发生时的鼠标 x 坐标,第七个是 y 坐标 [LINE]1,#dddddd[/LINE]系统信息:本贴获得楼主认可,66RPG感谢您的热情解答~
作者: Defanive    时间: 2009-5-24 19:26
提示: 作者被禁止或删除 内容自动屏蔽
作者: 紫苏    时间: 2009-5-24 20:13
WM_CHAR 消息是在调用 TranslateMessage 之后才发送到消息队列的,如果不调用 TranslateMessage 的话只能捕获到 WM_KEYDOWN,所以应该这样:
GetMessage = Win32API.new("user32", "GetMessage", ['P', 'L', 'I', 'I'], 'I')
FindWindow = Win32API.new("user32", "FindWindowA", ['P','P'], 'L')
TranslateMessage = Win32API.new("user32", "TranslateMessage", ['P'], 'I')

hw = FindWindow.call("RGSS Player",nil)

msg = " " * 28
begin
  while(GetMessage.call(msg, hw, 0, 0))
    TranslateMessage.call(msg)
    temp = msg.unpack("L*")
    if temp[1] == 258
      p "WM_CHAR", temp[2], temp[2].chr
    end
  end
rescue Hangup
  retry
end


别调用 Graphics.update,因为这个函数可能对消息做了拦截,所以即使调用了 TranslateMessage 也无法捕获 WM_CHAR ……直接捕获 Hangup 异常来防止脚本已备份即可

上面调用了 Integer 的 chr 方法,返回 ASCII 码所对应的字符~ [LINE]1,#dddddd[/LINE]系统信息:本贴获得楼主认可,66RPG感谢您的热情解答~
作者: Defanive    时间: 2009-5-24 21:16
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1