能不能写一个程序B,用来监视程序A的状态栏
能不能写一个程序B,用来监视程序A的状态栏,只要程序A的状态栏发生变化,B程序就执行一段代码?
谢谢各位帮忙,小弟感激不尽。
有相关代码最好,谢谢!
问题点数:100、回复次数:14Top
1 楼zolen()回复于 2005-06-04 10:11:28 得分 0
能获得句柄的控件一般可以监视.Top
2 楼wwff2004(含剑封雪)回复于 2005-06-04 12:20:10 得分 0
要监控状态栏的第二栏,如果有变化就执行一段程序,请各位帮忙。谢谢!Top
3 楼gamestory(无叶菜)回复于 2005-06-04 13:22:42 得分 0
如果两个程序都是自己编写的话,那就比较好办。但如果你要监视别人的程序可能就不行了。Top
4 楼langkew(拉倒)回复于 2005-06-04 13:25:11 得分 0
如果是监视自己的程序可以把被监视的程序做成ActiveX exe,使用RaiseEvent进行通信.Top
5 楼wwff2004(含剑封雪)回复于 2005-06-04 14:21:33 得分 0
啊?
我是要监视另一个程序,不是自己写的,是别人的,用VC写的EXE程序
有没有办法?Top
6 楼dqhuaying(不再留恋)回复于 2005-06-04 15:10:36 得分 0
这个...好象要通信知识吧Top
7 楼wwff2004(含剑封雪)回复于 2005-06-04 15:55:56 得分 0
哦,
有没有相关源码或代码程序段让我学习,先谢谢了Top
8 楼tanaya(唐博士http://blog.csdn.net/tanaya)回复于 2005-06-04 16:03:43 得分 50
思路就是枚举程序A的所有句柄,然后从中得到状态栏的信息,并保存这个信息
然后不停的重新获取这个状态栏的信息,如果发现和之前的不一致,就执行你的代码
Top
9 楼tanaya(唐博士http://blog.csdn.net/tanaya)回复于 2005-06-04 16:07:47 得分 50
具体主要使用一下几个函数:
Private Declare Function EnumChildWindows Lib "user32" Alias "EnumChildWindows" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function EnumThreadWindows Lib "user32" Alias "EnumThreadWindows" (ByVal dwThreadId As Long, ByVal lpfn As Long, ByVal lParam As Long) As Long
Top
10 楼wwff2004(含剑封雪)回复于 2005-06-04 17:01:25 得分 0
好,先谢谢,我去试试,Top
11 楼wwff2004(含剑封雪)回复于 2005-06-05 13:50:31 得分 0
我可以找到状态栏的类
Class: msctls_statusbar32
hWnd: 132060
Text: [CHN]
但我找不到状态栏的第二栏?有人会吗?
Top
12 楼wwff2004(含剑封雪)回复于 2005-06-06 22:34:11 得分 0
Option Explicit
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_GETTEXT = &HD
Private Const WM_GETTEXTLENGTH = &HE
Private Const GW_CHILD = 5
Private Const GW_HWNDNEXT = 2
Private Const GW_HWNDFIRST = 0
Private Sub Command1_Click()
Dim txt As String
Dim child_hwnd As Long
Dim parent_hwnd As Long
Dim children() As Long
Dim num_children As Integer
Dim i As Integer
parent_hwnd = FindWindow(vbNullString, Text2.Text)
If parent_hwnd = 0 Then Exit Sub
num_children = 0
child_hwnd = GetWindow(parent_hwnd, GW_CHILD)
Do While child_hwnd <> 0
num_children = num_children + 1
ReDim Preserve children(1 To num_children)
children(num_children) = child_hwnd
child_hwnd = GetWindow(child_hwnd, GW_HWNDNEXT)
Loop
For i = 1 To num_children
txt = txt & WindowText(children(i)) & vbCrLf
Next i
Text1.Text = txt
End Sub
Public Function WindowText(window_hwnd As Long) As String
On Error Resume Next
Dim txtlen As Long
Dim txt As String
WindowText = ""
txtlen = SendMessage(window_hwnd, WM_GETTEXTLENGTH, 0, 0)
If txtlen = 0 Then Exit Function
txtlen = txtlen + 1
txt = Space$(txtlen) & vbCrLf & Space$(txtlen)
txtlen = SendMessage(window_hwnd, WM_GETTEXT, txtlen, ByVal txt)
WindowText = Left$(txt, txtlen)
End Function
-------
以上是我写的代码,只能取到在状态栏的第一栏文本,但取不到第二栏的,
窗口上放1个COMMAND,2个TEXT控件。
谁能帮我一下,谢谢!Top
13 楼imur05()回复于 2005-06-17 13:18:28 得分 0
我也想知道!Top
14 楼mmcer(小林子)回复于 2005-06-21 18:31:09 得分 0
你也可以先测试嘛,找到它的具体的句柄然后在程序里直接监视就可以了。Top




