大虾们,帮帮忙~~麻烦了 VB中回调函数怎么用?我这里回调的时候出现错误还望大虾指点 Public Function EnumWindowsProc_1(hwnd As Long, lParam As Long) As Long
'Private Function EnumWindowsProc_1(hwnd As Long, lparam As Long)
Dim lpWinTitle(256) As String
Dim m_strTitle As String
GetWindowText hwnd, lpWinTitle, 256 - 1
m_strTitle = CStr(lpWinTitle)
If GetEdHnd = False Then
FNamdeEditHnd = hwnd
SendMessage FNamdeEditHnd, WM_SETTEXT, Len(sfile), CLng(sfile)
GetEdHnd = True
End If
If (GetEdHnd = True) And (m_strTitle = "OK") Then
BTOkHnd = hwnd
End If
If m_strTitle = "1" Then
Bt1Hnd = hwnd
SendMessage Bt1Hnd, WM_SETFOCUS, 0, 0
PostMessage Bt1Hnd, BM_CLICK, 0, 0
PostMessage Bt1Hnd, BM_CLICK, 0, 0
End If
EnumWindowsProc_1 = True
End Function 调用时候
If EnumChildWindows(IGBHnd, GetAddress(AddressOfEnumWindowsProc_1), 0) = 0 Then
MessageBox MyHnd, "Enum file name editor fail", "", 0
End IfPublic Function GetAddress(ByVal add As Long) As Long
GetAddress = add
End Function
'Private Function EnumWindowsProc_1(hwnd As Long, lparam As Long)
Dim lpWinTitle(256) As String
Dim m_strTitle As String
GetWindowText hwnd, lpWinTitle, 256 - 1
m_strTitle = CStr(lpWinTitle)
If GetEdHnd = False Then
FNamdeEditHnd = hwnd
SendMessage FNamdeEditHnd, WM_SETTEXT, Len(sfile), CLng(sfile)
GetEdHnd = True
End If
If (GetEdHnd = True) And (m_strTitle = "OK") Then
BTOkHnd = hwnd
End If
If m_strTitle = "1" Then
Bt1Hnd = hwnd
SendMessage Bt1Hnd, WM_SETFOCUS, 0, 0
PostMessage Bt1Hnd, BM_CLICK, 0, 0
PostMessage Bt1Hnd, BM_CLICK, 0, 0
End If
EnumWindowsProc_1 = True
End Function 调用时候
If EnumChildWindows(IGBHnd, GetAddress(AddressOfEnumWindowsProc_1), 0) = 0 Then
MessageBox MyHnd, "Enum file name editor fail", "", 0
End IfPublic Function GetAddress(ByVal add As Long) As Long
GetAddress = add
End Function
解决方案 »
- 取得文件路径
- 怎么让程序的窗体随机器的屏幕区域的改变而改变???
- 想编一个电子相册,如何实现溶解,消失,马赛克等图片切换效果?
- 同学让我帮忙看程序
- 己知一个程序读串口1,能不能用工具实现再读串口1中的数据?
- “VB与EXCEL、VB与ACCESS”的问题
- 向 高手请教:如何编制菜单!
- 菜鸟求教:关于Collection对象的排序
- 并口打印问题解决,送分!请ByTheWay(到此一游) 进来拿分!
- 关于网络通信的问题
- 找到了窗口句柄H,为什么用CloseWindow H或DestroyWindow H都不能杀掉这个进程。如何强制杀掉这个进程和窗口?
- 如何将生成的DLL组件变成MSI安装程序再添加到Windows组件服务里啊?
参考一下我的回调函数(已经调试过没有问题):Public Function WndProc(ByVal hwnd As Long,ByVal Msg As Long,ByVal wParam As Long,ByVal lParam As Long) As Long '自定义窗口处理程序
On Error Resume Next If Msg = WM_LBUTTONDBLCLK Then '截获鼠标双击消息
Dim r As Long
On Error Resume Next
If (Player.PDFullScreen) Then
r = ShowWindow(PlayScreen.Hwnd, SW_SHOWMINIMIZED) '最小化
Else
r = ShowWindow(PlayScreen.Hwnd, SW_SHOWMAXIMIZED) '最大化
End If
Else
If Msg = WM_RBUTTONDOWN Then '弹出右键菜单
PlayScreen.PopupMenu PlayScreen.PlayMenu
Else
If Msg = WM_LBUTTONDOWN And LockMouseLeftClick = False Then '单击鼠标左键激活播放器
If ClickMouse Then
Call SetWindowPos(Player.hwnd, HWND_TOPMOST, 0, 0, 0, 0, 3)
Call ShowWindow(Player.hwnd, SW_RESTORE)
ClickMouse = False
Else
ClickMouse = True
End If
Else
WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam,lParam) '操作系统预定义窗口处理程序
End If
End If
End If
End Function
参见我的问题(里面5楼):
http://topic.csdn.net/u/20070212/10/4643bcca-8dbf-49e6-b2f5-cc765eb24e35.html
这个语句 程序就崩溃了 addressof 内存出错
If EnumChildWindows(IGBHnd, AddressOf EnumWindowsProc_1, 0) = 0 Then
MessageBox MyHnd, "Enum file name editor fail", "", 0
End If
能不能说下哪错了,这与回调函数参数没什么关系吧?我改参数出现同样问题
调用方法是:必须用SetWindowLong来调用prevWndProc=SetWindowLong(hWnd,GWL_WNDPROC,AddressOf EnumWindowsProc_1) 调用成功,prevWndProc不为0。你那种调用方法我没见过!另外:编写回调函数(先存盘),不能用调试的方法,否则会崩溃!
参考一下我的写法:
Public hWndOfPlayVideo As Long'视频播放窗口的句柄 '取得Flash.ocx控件视频播放窗口的句柄
Public Function EnumFlashChildProc(ByVal lhWnd As Long, ByVal lParam As Long) As Long
Dim RetVal As Long
Dim WinClassBuf As String * 255
Dim WinClass As String
RetVal=GetClassName(lhWnd,WinClassBuf,255)
If (InStr(WinClassBuf, Chr(0))>0) Then
WinClass=Left(WinClassBuf,InStr(WinClassBuf,Chr(0))-1)
End If
If WinClass="MacromediaFlashPlayerActiveX" Then
hWndOfPlayVideo=lhWnd
EnumChildProc=False
Else
If Left(WinClass,4)="ATL:" Then
hWndOfPlayVideo=lhWnd
EnumChildProc=False
Else
EnumChildProc=True
End If
End If
End Function
lhWnd=PlayScreen.hwnd
lRet=EnumChildWindows(lhWnd, AddressOf EnumFlashChildProc, lParam)
If hWndOfPlayVideo< >0 Then
prevWndProc=SetWindowLong(hWndOfPlayVideo,GWL_WNDPROC,AddressOf WndProc)
End If
CJL=hWndOfPlayVideo
那看看我这个吧,我这个是枚举MDI中的子窗体的'这个是我自定义的枚举
Enum ECWA
ECW_CLOSEALL = &H1 '关闭所有子窗口
'为子窗口增加菜单(这个你就不要看了,没有我程序中的其他代码你是看不明白的)
'MDI主窗体中的菜单一般都有一个名为“窗口”的菜单,里面列出了所有子窗体的名称
'这里我不使用默认的,而是自己制作这个“窗口”菜单
ECW_ADDMENU = &H2
ECW_WINDOWEXIST = &H4 '判断子窗口是否存在
End Enum
'这个也是我自定义的类型,用作传给回调函数中的lParam
Type ENUMCHILDWINDOW
Action As ECWA
lParam As Long '通常用作存储窗口句柄或其他附加参数
lReturn As Long '返回值
End TypeFunction EnumChildProc(ByVal hWnd As Long, ByVal lParam As Long) As Boolean
Static i As Integer
Dim ECW As ENUMCHILDWINDOW
Dim MII As MENUITEMINFO
Dim lngParent As Long
Dim strBuffer As String
EnumChildProc = True
lngParent = GetParent(hWnd) If lngParent = 0 Or lngParent <> MDIClient Then Exit Function
MII.cbSize = Len(MII)
MII.fMask = MIIM_STATE Or MIIM_FTYPE Or MIIM_STRING Or MIIM_ID
MII.fType = MFT_STRING
CopyMemory ECW, ByVal lParam, Len(ECW)
Select Case ECW.Action
Case ECW_CLOSEALL
If hWnd <> ECW.lParam Then
SndMsg hWnd, WM_CLOSE, 0&, 0&
If IsWindow(hWnd) = 1 Then EnumChildProc = False
End If
Case ECW_ADDMENU
If i = 0 Then MII.fState = MFS_CHECKED
MII.wID = hWnd
MII.dwTypeData = "&" & i + 1 & " " & GetWindowText(hWnd)
InsertMenuItem glngSubMenu, i + 4, True, MII
i = i + 1
If GetWindow(hWnd, GW_HWNDNEXT) = 0 Then
ECW.lReturn = i
i = 0
End If
Case ECW_WINDOWEXIST
If ECW.lParam > UBound(gWC) Or ECW.lParam < LBound(gWC) Then EnumChildProc = False
If GetWindowText(hWnd) = byte2Str(gWC(ECW.lParam).Caption) Then
SndMsg MDIClient, WM_MDIACTIVATE, hWnd, ByVal 0&
ECW.lReturn = True
EnumChildProc = False
End If
End Select
CopyMemory ByVal lParam, ECW, Len(ECW)
CopyMemory ECW, 0&, Len(ECW)
End Function
'下面是调用:
'ECW.Action = ECW_WINDOWEXIST '检查子窗口是否存在
'ECW.lParam = hWnd_Child '传入子窗口举柄
'hWndParent 为父窗体句柄
'Call EnumChildWindows(hWndParent, AddressOf EnumChildProc, ByVal ECW)
'若ECW.lReturn=0则表示子窗口不存在,否则表示存在
'ECW.Action = ECW_CLOSEALL '关闭所有子窗体
'EnumChildWindows hWndParent, AddressOf EnumChildProc, ByVal ECW慢慢研究研究
而不用另外获得函数地址这么麻烦的
除非是一些类型中定义的值,例如注册类中的类型:Private Type WNDCLASS
style As Long
lpfnwndproc As Long '这个就需要用到你的GetAddress函数了
cbClsextra As Long
cbWndExtra2 As Long
hInstance As Long
hIcon As Long
hCursor As Long
hbrBackground As Long
lpszMenuName As String
lpszClassName As String
End Type
On Error Resume Next
Dim lpWinTitle(256) As Byte
Dim m_strTitle As String
'Dim hIput As Long
GetWindowText hwnd, lpWinTitle, 256 - 1 '
m_strTitle = CStr(lpWinTitle)
If GetEdHnd = False Then
FNamdeEditHnd = hwnd
SendMessage FNamdeEditHnd, WM_SETTEXT, LenB(ww), CLng(ww) ' 发文件ww到另软件打开, 把文件名发送到窗体
GetEdHnd = True
End If
If (GetEdHnd = True) And (m_strTitle = "OK") Then ' 发生成功后确定
BTOkHnd = hwnd
End If
If m_strTitle = "1" Then
Bt1Hnd = hwnd
SendMessage Bt1Hnd, WM_SETFOCUS, 0, 0
PostMessage Bt1Hnd, BM_CLICK, 0, 0
PostMessage Bt1Hnd, BM_CLICK, 0, 0
End If
EnumWindowsProc_1 = True
End Function
这个回调函数
我调用的时候
就是用
If Bt1Hnd = 0 Then '把文件用另一软件打开。
If EnumChildWindows(IGBHnd, AddressOf EnumWindowsProc_1, 0) = 0 Then '枚举Imput Gerber的所有窗口
MessageBox MyHnd, "Enum file name editor fail", "", 0
End If
可能回调函数错了,我在VC编的时候运行没有问题,可怎么在VB中运行就有问题
BOOL CALLBACK EnumWindowsProc_1(HWND hwnd,LPARAM lparam) //
{
char lpWinTitle[256];
::GetWindowText(hwnd,lpWinTitle,256-1);
string m_strTitle=(string)lpWinTitle;
if(GetEdHnd==FALSE)
{
FNamdeEditHnd=hwnd;
// char buf[]="e:\\ouyang\\GERBER\\GBX\\MA009S0707001.GBX";
::SendMessage(FNamdeEditHnd,WM_SETTEXT,strlen(buf),(LPARAM)buf);
GetEdHnd=TRUE;
}
if((GetEdHnd==TRUE)&&(m_strTitle=="OK"))
{
BtOkHnd=hwnd;
} if(m_strTitle=="1")
{
Bt1Hnd=hwnd;
::SendMessage(Bt1Hnd,WM_SETFOCUS,0,0);
::PostMessage(Bt1Hnd,BM_CLICK,0,0);
::PostMessage(Bt1Hnd,BM_CLICK,0,0);
} return TRUE;
}
运行没有问题
调用的时候: if(Bt1Hnd==0)
{
if(::EnumChildWindows(IGBHnd,EnumWindowsProc_1,0)==0)
::MessageBox(MyHnd,"Enum file name editor fail","",0);
}
可是怎么用VB就有问题