CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

能不能写一个程序B,用来监视程序A的状态栏

楼主wwff2004(含剑封雪)2005-06-03 23:32:23 在 VB / 基础类 提问

能不能写一个程序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

相关问题

  • 能不能写一个程序B,用来监视程序A的状态栏
  • 状态栏...
  • 关于状态栏
  • 状态栏问题
  • 状态栏问题
  • 关于状态栏问题
  • 状态栏显示时间
  • CFormView 的状态栏图标
  • 做自己的状态栏
  • 做自己的状态栏

关键词

  • 监视
  • 代码
  • 执行
  • 信息
  • txtlen
  • 状态栏
  • 程序
  • longprivate
  • longdim
  • children

得分解答快速导航

  • 帖主:wwff2004
  • tanaya
  • tanaya

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo