用API得到自己程序中的某个窗口的hwnd,不使用循环测试每个窗口的hwnd的方法,
我想调用该窗口内的子程序。怎么办?
我想调用该窗口内的子程序。怎么办?
解决方案 »
- 高手帮忙解决过程函数 参数的问题
- 大哥救救我呀!急!
- 请问有没有html解析的例子,最好能够转成xml
- ====有关Load方法将每个OLE控件放到每个PictureBox控件上,为何OLE控件显示不出的问题====
- 难题:急求VB下实现如同photoshop里调整色阶(adjust levels)的算法或代码
- 一句关于求和的SQL语句,高分相送~急~~~~~
- 很奇怪的问题,解决了满分奉送
- 一个最简单的价值1000的SQL
- ASP调用自制dll中可以使用webbrowser控件吗
- 高分求解,sql存储过程的难题
- 自动换行的文本框中换行的地方有没有换行符chr(10)
- 请问各位大侠哪里有VBA的源程序下载和VBA的教程和书籍下载,
Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
说明
在窗口列表中寻找与指定条件相符的第一个子窗口
返回值
Long,找到的窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError
参数表
参数 类型及说明
hWnd1 Long,在其中查找子的父窗口。如设为零,表示使用桌面窗口(通常说的顶级窗口都被认为是桌面的子窗口,所以也会对它们进行查找)
hWnd2 Long,从这个窗口后开始查找。这样便可利用对FindWindowEx的多次调用找到符合条件的所有子窗口。如设为零,表示从第一个子窗口开始搜索
lpsz1 String,欲搜索的类名。零表示忽略
lpsz2 String,欲搜索的类名。零表示忽略
因为各个窗口是相关联的,就像radiobox,当用户选中某一个窗口后其它窗口要作出反应,调用那些窗口的子程序,用循环很用资源的,不合算。
事情是这样的,我做了一个用户控件,当窗口得到或失去焦点时,该控件就会做出相应的变化。
我拦截了WM_ACTIVATE消息得到窗口焦点的变化得到hwnd,问题是我怎么通知该控件窗口的焦点
已变化。我现在的做法是用循环的方法判断hwnd是属于哪个窗口的,从而知道哪个窗口焦点发
生变化,再直接调用该窗口的子程序去通知那控件。每次都这样做很耗资源,谁有更好的方法呢?
用PostMessage
如果是另一个进程 你不能调用 如果是同一个进程 你直接调用就行 何必用hWnd?
2、当前窗体你是用窗体子类分别判断的?
3、控件知道当前窗体要执行什么操作(和当前窗体相关)? 我的一点看法:
Private Declare Function GetActiveWindow Lib "user32" Alias "GetActiveWindow" () As Long
在控件里,你可以用以上api活动当前活动窗体呀!!
我要得到窗口焦点的变化,就只能得到它的hwnd,我如何直接调用呀?详细一点可以吗?to yefanqiu(叶帆):
是部分窗口有这个控件。
另外,无论窗口是得到或失去焦点控件都要作出反应,GetActiveWindow可以做到吗?而且控件是被动的,实际运行时我应该在哪个窗口的控件里使用GetActiveWindow
消息如何截呀?用Hook吗?那要放在标准模块中,在自定义控件中无法截消息.
'----------------------------
'控件 UserControl1
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 UserControl_Initialize()
Set UseCon = MeEnd Sub
Public Sub SetColor(intFlag As Integer)
If intFlag = 0 Then
UserControl.BackColor = RGB(255, 0, 0)
Else
UserControl.BackColor = RGB(0, 255, 0)
End IfEnd Sub
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
If Ambient.UserMode = True Then '加载
OldWindowProc = SetWindowLong(UserControl.HWnd, GWL_WNDPROC, AddressOf SubClass1_WndMessage)
Exit Sub
End If
If Ambient.UserMode = False And OldWindowProc > 0 Then '卸载
Call SetWindowLong(UserControl.HWnd, GWL_WNDPROC, OldWindowProc)
OldWindowProc = 0
Exit Sub
End IfEnd Sub
Public Property Get HWnd() As Long
HWnd = UserControl.HWnd
End Property'----------------------------------
'控件工程中的模块
Option Explicit
Public OldWindowProc As Long
Public UseCon As Object
Public Const WM_USER = &H400
Public Const WM_RED = WM_USER + 100
Public Const WM_GREEN = WM_USER + 200
'将消息传答窗口函数
Public 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 SubClass1_WndMessage(ByVal HWnd As OLE_HANDLE, ByVal Msg As OLE_HANDLE, ByVal wp As OLE_HANDLE, ByVal lp As Long) As Long
Select Case Msg
Case WM_RED
Call UseCon.SetColor(0)
Case WM_GREEN
Call UseCon.SetColor(1)
End Select
SubClass1_WndMessage = CallWindowProc(OldWindowProc, HWnd, Msg, wp, lp)
End Function'---------------------------------
'加载用户控件的工程中的form1Option ExplicitPrivate Const WM_USER = &H400
Private Const WM_RED = WM_USER + 100
Private Const WM_GREEN = WM_USER + 200
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPrivate Sub Command1_Click()
SendMessage UserControl11.hwnd, WM_RED, 0, 0
End Sub
Private Sub Command2_Click()
SendMessage UserControl11.hwnd, WM_GREEN, 0, 0
End Sub
’这段代码改成如下
Public Sub SetColor(intFlag As Integer, hWnds As Long)
Dim hdc As Long
Dim hRPen As Long
Dim re As RECT
hdc = GetDC(hWnds)
GetWindowRect hWnds, re
If intFlag = 0 Then
hRPen = CreatePen(PS_SOLID, 100, vbRed)
Else
hRPen = CreatePen(PS_SOLID, 100, vbGreen)
End If
DeleteObject SelectObject(hdc, hRPen)
Rectangle hdc, 0, 0, re.Right - re.Left, re.Bottom - re.Top
DeleteObject hRPen
End Sub'模块里的代码改成这样Public Function SubClass1_WndMessage(ByVal hwnd As OLE_HANDLE, ByVal Msg As OLE_HANDLE, ByVal wp As OLE_HANDLE, ByVal lp As Long) As Long
Select Case Msg
Case WM_RED
Call UseCon.SetColor(0, hwnd) ’-----------
Case WM_GREEN
Call UseCon.SetColor(1, hwnd) ‘-----------
End Select
SubClass1_WndMessage = CallWindowProc(OldWindowProc, hwnd, Msg, wp, lp)
End Function‘测试程序Private Sub Command1_Click()
SendMessage UserControl11.hwnd, WM_RED, 0, 0
End Sub
Private Sub Command2_Click()
SendMessage UserControl11.hwnd, WM_GREEN, 0, 0
End SubPrivate Sub Command3_Click()
SendMessage UserControl12.hwnd, WM_RED, 0, 0
End Sub
Private Sub Command4_Click()
SendMessage UserControl12.hwnd, WM_GREEN, 0, 0
End Sub
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 Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
Private Const PS_SOLID = 0
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function Rectangle Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
' 你可以在这个函数里面判断:
hwnds和UserControl.hwnd 是否相同,然后再决定该怎么做!
endsub
你可以把你的问题说的明白些,这样正面的办法找不到,可以采用其他的替代方法也可以