怎样依靠已知的窗体句柄得到发送到窗体上的消息

GoodShot 2010-08-26 12:43:09
我能得到浏览器的窗体句柄hHandle,目前我有两个问题
1)根据网上的GetWindowLong(hHandle,GWL_HINSTANCE)的解释,我试图得到发送到浏览器窗体的消息id(不知用这个函数对不对,如果是的话第二个参数的选择是否意味着通过这个函数我可以得到该消息id;如果不对的话,应该如何修改)
2)根据已知,怎样得到消息(当然包括LParam和WParam)
...全文
178 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
GoodShot 2010-08-26
  • 打赏
  • 举报
回复
能说的具体点吗
ZengHD 2010-08-26
  • 打赏
  • 举报
回复
注入目标程序
然后重新处理消息处理函数
stainboy 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 goodshot 的回复:]

我大概再描述一下我的问题:
我不知道浏览器中是否存在一个类似System.Windows.Forms命名空间下能拦截窗体消息的Application.AddMessageFilter方法(我没有找到,如果有的话请大家赐教),因此改用钩子想拦截鼠标消息,但我的钩子函数中要求传递四个参数(1)浏览器句柄(2)消息id(发送到浏览器上的) (3)消息wparam参数 (4)消息lparam参数
我……
[/Quote]

我认为楼主应该把问题再描述清楚一点。最好把上下文补充出来,认真的描述一下你希望做一件什么事情,尽可能避免用技术语言来描述(因为你自己不太清楚如何实现,有可能会写错一些技术关键字来误导回答者)。

举个例子,通常我会这样提问:
我想要做一个客户端应用程序,最好是C#开发,功能是可以监视并记录IE(或者Firefox)浏览器每一次加载的URL,写入一个LOG文件,方便我日后查询。

我相信CSDN上面有很多牛人存在的,不过牛人回答问题的大前提是能够看懂并理解问题。
GoodShot 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mngzilin 的回复:]
引用 4 楼 goodshot 的回复:
A.
mngzilin:
SendMessage PostMessage 是啊,我要的是里面的参数LParam和WParam,但我现在想知道怎么取出LParam和WParam?

B.
另外,我做了一下1)中的实验,发现的到的结果非常大(1978597376)转换为16进制根本在windows消息中找不到,请教大家如何才能得到消息的ID

……
[/Quote]

TO mngzilin:
抱歉啊,我的这方面知识有限,你的回答是说第二个问题吗,我没看懂啊,如果是第二个的话,“消息在高字节段还是低字节段”我也不知道,我的大致的代码如下:
protected void Unnamed1_Click(object sender, EventArgs e)
{
int hHandle = FindWindow(null, "A - Microsoft Internet Explorer");
int num=GetWindowLong(hHandle, 0);
}
num=1978597376;
mngzilin 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 goodshot 的回复:]
A.
mngzilin:
SendMessage PostMessage 是啊,我要的是里面的参数LParam和WParam,但我现在想知道怎么取出LParam和WParam?

B.
另外,我做了一下1)中的实验,发现的到的结果非常大(1978597376)转换为16进制根本在windows消息中找不到,请教大家如何才能得到消息的ID
[/Quote]

参数是DWORD类型的,你需要合适的转换类型,至于你的消息在高字节段还是低字节段,需要你自己查资料。我在mfc中百试不爽
GoodShot 2010-08-26
  • 打赏
  • 举报
回复
顶一下
GoodShot 2010-08-26
  • 打赏
  • 举报
回复
需要说明的是,我就是在本应用程序(web应用程序)中写hook,让它监视线程中的浏览器接受的消息
GoodShot 2010-08-26
  • 打赏
  • 举报
回复
那api中的GetWindowLong(hHandle, GWL_HINSTANCE)不是也可以得到message id吗,

这里为什么需要注入,注入的原理是什么,能不能简单明了的说一下,

这里必须需要注入才能解决吗
捷哥1999 2010-08-26
  • 打赏
  • 举报
回复
估计楼主要的是第二种,属于代码注入范围了。
GoodShot 2010-08-26
  • 打赏
  • 举报
回复
我大概再描述一下我的问题:
我不知道浏览器中是否存在一个类似System.Windows.Forms命名空间下能拦截窗体消息的Application.AddMessageFilter方法(我没有找到,如果有的话请大家赐教),因此改用钩子想拦截鼠标消息,但我的钩子函数中要求传递四个参数(1)浏览器句柄(2)消息id(发送到浏览器上的) (3)消息wparam参数 (4)消息lparam参数
我现在就是想得到(2)(3)(4),不知道依靠现在的api能否得到这些内容
stainboy 2010-08-26
  • 打赏
  • 举报
回复
楼主,你是否希望截获目标窗口的消息队列?如果是的话,且往下看,否则就忽略我的发言吧。

分两种情况,第一种是目标窗口所在进程是你自己写的一个应用程序,第二种是目标窗口所在进程是一个已经存在的应用程序。

第一种很容易,你用C#写WinForm程序,重载WndProc方法即可。

第二种很难做,如一楼所说,你得把代码注入到目标进程里面,然后替换目标窗口的消息处理函数。注入的代码可以参考:http://www.codeproject.com/KB/threads/winspy.aspx,替换消息处理函数的代码可以参考:SetWindowLongPtr(hWnd, GWLP_WNDPROC)。

希望对你有帮助。
GoodShot 2010-08-26
  • 打赏
  • 举报
回复
A.
mngzilin:
SendMessage PostMessage 是啊,我要的是里面的参数LParam和WParam,但我现在想知道怎么取出LParam和WParam?

B.
另外,我做了一下1)中的实验,发现的到的结果非常大(1978597376)转换为16进制根本在windows消息中找不到,请教大家如何才能得到消息的ID
mngzilin 2010-08-26
  • 打赏
  • 举报
回复
SendMessage PostMessage

111,119

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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