程序代码:
Private Sub Form_Click()
dim Result as Long
If XPMenuClass.GetItemProc(CInt(selectedItem)) <> 0 Then
Result=CallWindowProc(ItemProc, 0&, 0&, 0&, 0&)
End If
End Sub其中ItemProc是函数地址(通过Addressof 获得),在2000调试和运行到没问题。在98 EXE文件运行没有问题,但是调试的时候,每当运行到Result=CallWindowProc(ItemProc, 0&, 0&, 0&, 0&),会先把地址为ItemProc的函数运行,但光标也听在这一句上说,提示:实时错误:DLL调用约定错误。
我这就CallWindowProc的语句用法有什么错误,如何修改?
另外,这程序能在XP下使用吗?
Private Sub Form_Click()
dim Result as Long
If XPMenuClass.GetItemProc(CInt(selectedItem)) <> 0 Then
Result=CallWindowProc(ItemProc, 0&, 0&, 0&, 0&)
End If
End Sub其中ItemProc是函数地址(通过Addressof 获得),在2000调试和运行到没问题。在98 EXE文件运行没有问题,但是调试的时候,每当运行到Result=CallWindowProc(ItemProc, 0&, 0&, 0&, 0&),会先把地址为ItemProc的函数运行,但光标也听在这一句上说,提示:实时错误:DLL调用约定错误。
我这就CallWindowProc的语句用法有什么错误,如何修改?
另外,这程序能在XP下使用吗?
因为这是一个通用自制菜单点击时发生的事件。在代码生成菜单时候同时把点击菜单时要运行的函数地址储存起来。所以就这样来解决。
比如点击菜单退出,就运行下面的函数
sub mnuExit()
if msgbox ("是否退出吗?",vbyesno or vbinformation)=vbyes then end if
end sub
end Sub
Private Sub Form_Click()
dim Result as Long
If ItemProc <> 0 Then
Result=CallWindowProc(ItemProc, 0&, 0&, 0&, 0&)
End If
End Sub
比如点击菜单退出,就运行下面的函数
sub mnuExit()
if msgbox ("是否退出吗?",vbyesno or vbinformation)=vbyes then
End
end if
end sub我看过一些例子但是和这个不同,我不知道其他参数应该如何使用。
类型比如 vbyesno, vbok 等等
图标比如 vbinformation, vbquestion, vbcritical
默认只有 vbdefaultbutto(1 - 3)
需要组合就用or来添加
public newproc as long
public oldproc as long窗体
load
oldproc = SetWindowLong(me.hwnd, GWL_WNDPROC, AddressOf newproc)
unload
SetWindowLong me.hwnd, GWL_WNDPROC, Oldprocnewproc必须是全局的公用的函数Public Function newproc(ByVal hwnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case iMsg
Case WM_SYSCOMMAND '比如选择了系统菜单的某一项,在这里进行拦截
'.....
case WM_COMMAND '又比如选择了菜单的某一项,而这个菜单不是基本的菜单,而是动态创建出来的菜单
'.....
Case Else
newproc = CallWindowProc(Oldproc, hwnd, iMsg, wParam, lParam)
End Select
End Function