不调用QueryUnload事件以及Unload事件。
解决方案 »
- 数据库和控件问题,急啊
- 10000分着急:Visual Basic 6大学教程 在线等待!
- 求一随机数生成算法
- 求取一份能获取大容量硬盘的物理id号的代码或DLL,谢谢!!!!
- 添加新记录的问题!
- 已知局域网内某机器的ip地址,如何得到他的机器名?
- 就现在的情况,大家所在的公司都用VB做什么项目?(来者有分)
- 这是怎么回事? (急待解决)
- 300行内搞定的源代码突显VB源程序,有没有人要??
- vb编译成可执行文件(例如:aa.exe)后,怎样在运行时得到自己的名字(aa.exe?
- 请教如何在VB程序中动态的创建SQL Server中的数据库?
- datareport的分组一定要用dataenviroment吗?
但这里有个小问题,加回去之后"X"仍是暗灰色,要等到我们做了某些固定的动作之后(如TittleBar上Click一下,或选一下SystemMenu等),
我不知道让TittleBar上的这些东西Refresh要送什么消息,所以现在我暂且Send一个在TittleBar上按下Mouse左键的消息给窗体,令"X"能出现的Enable颜色
在窗体上放置一个Command Button,输入以下代码,运行,点击一下Command Button 就可使"X" Enable.
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 AppendMenu Lib "User32" Alias "AppendMenuA"
(ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As
Any) As Long
Private Declare Function GetMenuString Lib "User32" Alias
"GetMenuStringA" (ByVal hMenu As Long, ByVal wIDItem As Long, ByVal lpString As
String, ByVal nMaxCount As Long, ByVal wFlag As Long) As Long
Private Declare Function SendMessage Lib "User32" Alias "SendMessageA"
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As
Any) As Long
Const WM_NCLBUTTONDBLCLK = &HA3
Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2
Const MF_STRING = &H0&
Const MF_BYCOMMAND = &H0&
Const SC_CLOSE = &HF060
Private hMenu As Long
Private CloseStr As String '纪录Close MenuItem的字符串
Private Sub Command1_Click()
'将"关闭"的那个MenuItem重新加入
Call AppendMenu(hMenu, MF_STRING, SC_CLOSE, CloseStr)
'令"X"出现Enable的颜色
Call SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
End Sub
Private Sub Form_Load()
hMenu = GetSystemMenu(Me.hwnd, 0)
CloseStr = String(255, 0)
'SC_CLOSE即是"关闭"的MenuItem ID
Call GetMenuString(hMenu, SC_CLOSE, CloseStr, 256, MF_BYCOMMAND)
CloseStr = Left(CloseStr, InStr(1, CloseStr, Chr(0)) - 1)
Call DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND)
End Sub
cancel=1 就行了
Cancel = 1 '(或者其它非0数均可)
End Sub
应该rainstormmaster(rainstormmaster) 的解答是合理的。其实可以更简单一点罗Public Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Public Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Public Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Public Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As LongPublic Const MF_BYPOSITION = &H400&
Public Const MF_DISABLED = &H2&
Public Sub DisableX(Frm As Form)
Dim hMenu As Long, nCount As Long
hMenu = GetSystemMenu(Frm.hwnd, 0)
nCount = GetMenuItemCount(hMenu)
Call RemoveMenu(hMenu, nCount - 1, MF_DISABLED Or MF_BYPOSITION) DrawMenuBar Frm.hwndEnd Sub
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Const MF_BYPOSITION = &H400&
Const MF_REMOVE = &H1000&
Private Sub Form_Load()
Dim hSysMenu As Long, nCnt As Long, i As Long
hSysMenu = GetSystemMenu(Me.hwnd, False)
If hSysMenu Then
nCnt = GetMenuItemCount(hSysMenu)
For i = nCnt To 0 Step -1
RemoveMenu hSysMenu, i, MF_BYPOSITION Or MF_REMOVE ' Remove the seperator
DrawMenuBar Me.hwnd
Me.Caption = "Try to close me!"
Next
End If
End Sub
2.
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Cancel = true
End Sub
这样也可以,不过最好还是对UnloadMode进行一下判断,对应该Cancel的消息才Cancel.