如何修改sendmessage的返回值?

quwuzhong 2006-08-17 08:10:02
我的程序的文本框的信息总是被人用sendmessage函数的wm_gettext方法获得,有没有什么方法,使返回值为空,不做任何反应,先谢谢各位大哥了!实现立即给分!!!
...全文
479 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
quwuzhong 2006-08-18
  • 打赏
  • 举报
回复
谢谢楼上的各位朋友,问题已经解决,马上给分!!!
mmcgzs 2006-08-18
  • 打赏
  • 举报
回复
让你的文本框 “聪明” 一点

http://blog.csdn.net/mmcgzs/archive/2004/02/04/20259.aspx
quwuzhong 2006-08-17
  • 打赏
  • 举报
回复
csdn的高手都哪去了,帮帮小弟呀!!!
难道真的没有高手了吗?
quwuzhong 2006-08-17
  • 打赏
  • 举报
回复
啊,那我可惨了呀,不全栏住,变成返回值为空就行,有没有办法,帮忙呀!
province_ 2006-08-17
  • 打赏
  • 举报
回复
WM_GETTEXT消息似乎拦截不了,存疑。
quwuzhong 2006-08-17
  • 打赏
  • 举报
回复
我顶!!!
quwuzhong 2006-08-17
  • 打赏
  • 举报
回复
我顶!!!!!
quwuzhong 2006-08-17
  • 打赏
  • 举报
回复
有没有人会用api拦截呀?
一楼的朋友方法虽然可以,但是我的程序文本框很多,而且对他的操作也很多,能不能不换控件,用api函数拦截一下呀?
各位朋友,希望不吝赐教呀,我相信csdn的朋友们一定不会见死不救的!
兄弟敬等佳音!!!
pigsanddogs 2006-08-17
  • 打赏
  • 举报
回复
To retrieve the text of a control in another process, send a WM_GETTEXT message directly instead of calling GetWindowText.

这只是ms的一种建议.
但为什么要这么做, 在msdn上并没有说清楚
参考上面那个文章
http://blogs.msdn.com/oldnewthing/archive/2003/08/21/54675.aspx
因为在非系统class模式下, 用GetWindowText是取不到数据的.
但vb的控件不是, ms的标准控件也不是. 所以没关系.

一般跨进程的sendmessage取的数据都是dword, char *都不能跨进程.
关于GetWindowText能跨进程, ms是这样解释的, 应该他使用的太频繁了.
所以就让他跨进程. (sysenter调用)
其他的取buf的message则需要dll inject来获取.
恩,dll inject,spy++也是这么做的.



happy_sea 2006-08-17
  • 打赏
  • 举报
回复
API拦截,不过俺不会。。。 -_-!
一楼的朋友的方法也不错
一笑拔剑 2006-08-17
  • 打赏
  • 举报
回复
用钩子hook一下
呵呵
leongwong 2006-08-17
  • 打赏
  • 举报
回复
关注!
boywang 2006-08-17
  • 打赏
  • 举报
回复
用label控件代替textbox,再写个label的输入函数。
province_ 2006-08-17
  • 打赏
  • 举报
回复
To retrieve the text of a control in another process, send a WM_GETTEXT message directly instead of calling GetWindowText.

不用再多说了,反正我们全是看MSDN的,跨进程取EDIT的内容上面有权威解释了。
pigsanddogs 2006-08-17
  • 打赏
  • 举报
回复
噢, 上面的1997是我测试用的你可以删除
GetWindowText是少数几个可以跨进程的函数之1
多个test可以分别
Private Sub Form_Load()
old = SetWindowLong(Text1.hWnd, GWL_WNDPROC, AddressOf newfunc)
old = SetWindowLong(Text2.hWnd, GWL_WNDPROC, AddressOf newfunc)
End Sub

Private Sub Form_Unload(Cancel As Integer)
Call SetWindowLong(Text1.hWnd, GWL_WNDPROC, old)
Call SetWindowLong(Text2.hWnd, GWL_WNDPROC, old)

End Sub

sendmessage是同步模式, 如果对方进程挂起,那么他会死锁
getwindowtext是为了解决这个问题设计的函数, 他是从系统中取到的
windows管理text分2中模式, 自动和系统.
只有系统模式才可以通过getwindowtext得到,否则需要用wm_gettext
一般系统的, 还有一些编译语言的, 都属于系统模式
推荐一个文章
http://blogs.msdn.com/oldnewthing/archive/2003/08/21/54675.aspx
pigsanddogs 2006-08-17
  • 打赏
  • 举报
回复
form


Option Explicit
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_WNDPROC = (-4)


Private Sub Form_Load()
old = SetWindowLong(Text1.hWnd, GWL_WNDPROC, AddressOf newfunc)
End Sub

Private Sub Form_Unload(Cancel As Integer)
Call SetWindowLong(Text1.hWnd, GWL_WNDPROC, old)
End Sub


module:

Option Explicit

Public old As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Function newfunc(ByVal hWnd As Long, ByVal umsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If umsg = &HD Then
Debug.Print hWnd, wParam, lParam
newfunc = 0
Exit Function
ElseIf umsg = 1997 Then
Debug.Print 1997
End If
newfunc = CallWindowProc(old, hWnd, umsg, wParam, lParam)
End Function
pigsanddogs 2006-08-17
  • 打赏
  • 举报
回复
getwindowtext 可以跨进程. 请做个例子确认.
spy++就是用getwindowtext的

摘自MSDN
If the target window is owned by the current process, GetWindowText causes a WM_GETTEXT message to be sent to the specified window or control. If the target window is owned by another process and has a caption, GetWindowText retrieves the window caption text. If the window does not have a caption, the return value is a null string. This behavior is by design. It allows applications to call GetWindowText without hanging if the process that owns the target window is hung. However, if the target window is hung and it belongs to the calling application, GetWindowText will hang the calling application.

To retrieve the text of a control in another process, send a WM_GETTEXT message directly instead of calling GetWindowText.


  • 打赏
  • 举报
回复
province_(雍昊) (说截WM_GETTEXT不行
我就没试
呵呵
可以就简单了
直接拦截截WM_GETTEXT就ok了
quwuzhong 2006-08-17
  • 打赏
  • 举报
回复
怎么做呀,province_(雍昊) 大哥:
小弟太感动了,在我绝望的时候你伸出了友谊之手,希望能给个详细的解法,我对api调用不是很明白,谢谢!!!
province_ 2006-08-17
  • 打赏
  • 举报
回复
getwindowtext也是要发送GETTEXT消息的,并且只能在同一进程内,跨进程无效。
加载更多回复(7)
在C#中SendMessage和PostMessage的参数传递 在C#中可以使用Window API提供的SendMessage和PostMessage来传递参数。两者的区别简单介绍下:返回值的不同,我们先看一下 MSDN 里的声明: LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ); BOOL PostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ); 其中 4 个参数的意义是一样的,返回值类型不同(其实从数据上看他们一样是一个 32 位的数,只是意义不一样),LRESULT 表示的是消息被处理后的返回值,BOOL 表示的是消息是不是 Post 成功。 2、PostMessage 是异步的,SendMessage 是同步的。 PostMessage 只把消息放入队列,不管消息是否被处理就返回,消息可能不被处理;而 SendMessage 等待消息被处理完了之后才返回,如果消息不被处理,发送消息的线程将一直被阻塞。 3、如果在同一个线程内,SendMessage 发送消息时,由 USER32.DLL 模块调用目标窗口的消息处理程序,并将结果返回。SendMessage 在同一线程中发送消息并不入线程消息队列。PostMessage 发送消息时,消息要先放入线程的消息队列,然后通过消息循环分派到目标窗口(DispatchMessage)。 如果在不同线程内,SendMessage 发送消息到目标窗口所属线程的消息队列,然后发送消息的线程在 USER32.DLL 模块内监视和等待消息处理,直到目标窗口处理完返回。SendMessage 在返回前还做了很多工作,比如,响应别的线程向它 SendMessage。Post 到别的线程时,最好用 PostThreadMessage 代替 PostMessage,PostMessage 的 hWnd 参数可以是 NULL,等效于 PostThreadMessage + GetCurrentThreadId。Post WM_QUIT 时,应使用 PostQuitMessage 代替。 4、系统只整编(marshal)系统消息(0 到 WM_USER 之间的消息),发送用户消息(WM_USER 以上)到别的进程时,需要自己做整编。 用 PostMessage、SendNotifyMessage、SendMessageCallback 等异步函数发送系统消息时,参数里不可以使用指针,因为发送者并不等待消息的处理就返回,接受者还没处理指针就已经被释放了。 5、在 Windows 2000/XP 里,每个消息队列最多只能存放 10,000 个 Post 的消息,超过的还没被处理的将不会被处理,直接丢掉。这个值可以改得更大:[HKEY_LOCAL_MACHINE/SOFTWARE/ Microsoft/Windows NT/CurrentVersion/Windows] USERPostMessageLimit,最小可以是 4000。 PostMessage只负责将消息放到消息队列中,不确定何时及是否处理 SendMessage要等到受到消息处理的返回码(DWord类型)后才继续 PostMessage执行后马上返回 SendMessage必须等到消息被处理后才会返回。

1,488

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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