我这已经有段程序可以实现锁定窗体功能(即不可以让鼠标拖动窗体),可是当很多窗体的情形下,会使程序当掉。已有的程序如下:Option ExplicitPrivate 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
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As LongPrivate lpPrevWndProc As LongPrivate Const GWL_WNDPROC = -4
Private Const WM_SYSCOMMAND = &H112
Private Const SC_MOVE = &HF010&Public Sub StartHook(hWnd As Long)
lpPrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc1)
End SubPublic Sub Unhook(hWnd As Long)
If lpPrevWndProc <> 0 Then SetWindowLong hWnd, GWL_WNDPROC, lpPrevWndProc
End SubPrivate Function WindowProc1(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
' If MDIForm1.LockandUnlock = False Then
' Exit Function
' End If
Select Case uMsg
Case WM_SYSCOMMAND
If (wParam And &HFFF0) = SC_MOVE Then
Debug.Print "move: " & Form1.hWnd; hWnd; uMsg; wParam; lParam
WindowProc1 = 0
Exit Function
End If
End Select
WindowProc1 = CallWindowProc(lpPrevWndProc, hWnd, uMsg, wParam, lParam)
End Function当程序锁定时,Function WindowProc1 始终被调用,而最终使程序当掉,有什么其他解决办法嘛,也用API实现。
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As LongPrivate lpPrevWndProc As LongPrivate Const GWL_WNDPROC = -4
Private Const WM_SYSCOMMAND = &H112
Private Const SC_MOVE = &HF010&Public Sub StartHook(hWnd As Long)
lpPrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc1)
End SubPublic Sub Unhook(hWnd As Long)
If lpPrevWndProc <> 0 Then SetWindowLong hWnd, GWL_WNDPROC, lpPrevWndProc
End SubPrivate Function WindowProc1(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
' If MDIForm1.LockandUnlock = False Then
' Exit Function
' End If
Select Case uMsg
Case WM_SYSCOMMAND
If (wParam And &HFFF0) = SC_MOVE Then
Debug.Print "move: " & Form1.hWnd; hWnd; uMsg; wParam; lParam
WindowProc1 = 0
Exit Function
End If
End Select
WindowProc1 = CallWindowProc(lpPrevWndProc, hWnd, uMsg, wParam, lParam)
End Function当程序锁定时,Function WindowProc1 始终被调用,而最终使程序当掉,有什么其他解决办法嘛,也用API实现。
解决方案 »
- vb数组控件的使用,下面程序如何实现 每点击一次鼠标 ,就出现一对 按钮和文本框 ?最多100对,
- 解决XML中出现的乱码问题
- VB写的程序运行时提示"运行时错误'429' ACTIVEX部件不能创建对象"
- datagrid问题,请faysky2和各位高手回答,谢谢
- vb access2000 往表里写东东,在线等ing
- 非常感谢online以及yinweihong帮助我一无所知的VB新手完成了一个小的工具!
- 请问各位高手,vb怎么连sqlserver2000?
- DBCombo、DBGrid、Access?
- VB启动.chm格式帮助文件的问题?
- 请教啦!
- 哈哈,太搞笑了,来至本论坛用错马甲的笑话,并再次散分
- 中山的VB程序员进来看一下
所以只能用API去实现了
如果是这样,确实只能使用api,而且貌似也只能HOOK,并在HOOK中使用全局变量随时限制和解除限制。
不知道你的代码是不是原封不动的就是这个
如果是的话, 你要考虑一个问题存储窗口处理函数地址的变量 Private lpPrevWndProc As Long
只有一个,而窗口很多时貌似你也是用这一个变量来存, 调用多次 starthook lpprevxxx 变量
存储的窗口处理函数地址却总指向最后一个, 也就是说所有的窗口被子类话的窗口的消息全被发送到了
最后一个被子类话的窗口上了
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Const SC_SIZE = &HF000
Private Const SC_MOVE = &HF010
Private Const MF_BYCOMMAND = &H0
Private Declare Function SetMenu Lib "user32" (ByVal hwnd As Long, ByVal hMenu As Long) As Long
Private Sub Command1_Click() '限制
Dim hwnd As Long
Dim hMenu As Long
Dim Success As Long hwnd = Form1.hwnd
hMenu = GetSystemMenu(hwnd, 0)
Success = RemoveMenu(hMenu, SC_SIZE, MF_BYCOMMAND) '/删除改变大小菜单
Success = RemoveMenu(hMenu, SC_MOVE, MF_BYCOMMAND) '/删除移动菜单
End SubPrivate Sub Command2_Click() '解除
Dim hwnd As Long
Dim hMenu As Long
Dim Success As Long
hwnd = Form1.hwnd
hMenu = GetSystemMenu(hwnd, 1)
End Sub