当前位置:编程学习 > VB >>

如何在一个程序中触发另一个程序中Label控件的Click事件

只有一个.exe文件的一个窗体上,在Label控件上写了一个Click事件
我自己有写了一个程序,需要执行这个Click事件,我该如何做
拜托了,我想了很久都不会,那位大侠帮个忙,我只有这么多分了 --------------------编程问答-------------------- 笨法:如果你要按另一个程序中的LABLE 就在注册表的一个地方新建一个字符数值为1 ,在有LABLE的程序中时时检测注册表中的这一个值为1时CALL LABLE_CLICK 然后设置注册表的数值为0 --------------------编程问答-------------------- 向程序发送消息。 --------------------编程问答-------------------- 楼上正解 --------------------编程问答-------------------- Lailuboy() ( ) 信誉:100    Blog  2007-4-1 8:02:55  得分: 0  
 
 
   
向程序发送消息。

  
 
正解 --------------------编程问答-------------------- Label控件是轻量控件,无句柄.......

是不是要向它的父窗口发送? --------------------编程问答-------------------- 如果两个程序都是你写的话,方法很多,如果不是,那就很麻烦了 --------------------编程问答-------------------- 用DDE消息 --------------------编程问答-------------------- 对了暴风雨,对于这类轻量控件,VB里面是如何处理的呢?

为什么它们没有句柄,却仍然可以响应MouseXX之类的事件?

而这些事件的消息,都是需要句柄的.......

这些消息,向谁发了?

又是如何在轻量控件里面形成事件的?

难道这些轻量控件是直接在父容器的WndProc里取消息的??? --------------------编程问答-------------------- 上午刚写了一个,发给楼主参考


開啟Lotus Notes并自動輸入密碼

Declare Function GetClassNameA Lib "user32" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Declare Function FindWindowA& Lib "user32" (ByVal lpClassName$, ByVal lpWindowName$)
Declare Function SetActiveWindow Lib "user32" (ByVal hwnd As Long) As Long
Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Declare Function GetWindowTextA Lib "user32" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function SendString Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As String
Declare Function SendCommand Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As String

Const WM_SETTEXT = &HC
Const BM_CLICK = &HF5
Const GW_CHILD = 5
Const GW_HWNDNEXT = 2

Function GetClassNameStr(hwnd As Long) As String
  Dim TempStr As String
  Dim Rc      As Long
  TempStr = Space(260)
  Rc = GetClassNameA(hwnd, TempStr, Len(TempStr))
  GetClassNameStr = StrConv(LeftB$(StrConv(TempStr, vbFromUnicode), Rc), vbUnicode)
End Function

Function GetWndText(hwnd As Long) As String
  Dim K     As Long
  Dim sName As String
  sName = Space$(128)
  K = GetWindowTextA(hwnd, sName, Len(sName))
  GetWndText = IIf(K > 0, Left$(sName, K), "未知")
End Function

Private Sub Form_Load()
  Me.Hide
  Dim hwnd As Long
  Dim CName As String
  Call Shell("d:\Lotus\Notes\notes.exe", 1)
  Do While True
     hwnd = FindWindowA("#32770", "輸入密碼")
     If hwnd <> 0 Then SetActiveWindow hwnd: Exit Do
  Loop
  DoEvents
  hwnd = GetWindow(hwnd, GW_CHILD)
  If hwnd = 0 Then Exit Sub
  Do While hwnd > 0
     Select Case GetClassNameStr(hwnd)
     Case "IRIS.password"
          SendString hwnd, WM_SETTEXT, 0&, "1234"
     Case "Button"
          '無焦點需發兩次
          If InStr(GetWndText(hwnd), "確定") Then SendCommand hwnd, BM_CLICK, 0, 0
     End Select
     hwnd = GetWindow(hwnd, GW_HWNDNEXT)
  Loop
  End
End Sub
--------------------编程问答-------------------- Label实际上是VB基于容器的WM_PAINT消息直接画在容器上的,Label的事件也是基于容器的消息转换而来的。所以向其容器发Label范围内的鼠标消息,可触发相应的鼠标事件。

不过MouseDown、UP、Move与DBClick等事件有对应的WM消息,但Click事件没有,我试过通过先后一个Down与UP是不能触发VB的Click事件的,不知哪位有相应办法。 --------------------编程问答-------------------- 原来果然是从容器的消息循环里搞来的

应该与VC里的消息映射那样的原理差不多吧? --------------------编程问答-------------------- //对了暴风雨,对于这类轻量控件,VB里面是如何处理的呢?
为什么它们没有句柄,却仍然可以响应MouseXX之类的事件?


我们不能像子类化普通的有窗口的控件一样来子类化无窗口的控件.然而ActiveX控件的规范允许一个无窗口的控件通过IOleInPlaceObjectWindowless接口的OnWindowMessage方法来得到在它的区域内发生的消息,像通常的消息流一样,vB不允许我们自动的访问这些消息.但是我们可以通过提供这个接口的定制实现来获得这些消息。
补充:VB ,  API
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,