请教如何使vb.net窗体的右上角关闭按扭失效?

leaf4646 2002-12-20 02:41:14
在vb6.0中调用

Private Declare Function GetSystemMenu Lib "User32" (ByVal hwnd As Long, ByVal bRevert 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 Declare Function DrawMenuBar Lib "User32" (ByVal hwnd As Long) As Long
Private Declare Function GetMenuItemCount Lib "User32" (ByVal hMenu As Long) As Long
Private Const MF_BYPOSITION = &H400&
Private Const MF_DISABLED = &H2&

Private Sub Form_Load()
Call closeX(Me)

End Sub

Private Sub closeX(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.hwnd
End Sub


可以达到目的,请问在vb.net中怎样实现这样的功能?
...全文
371 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainmyheart 2002-12-24
  • 打赏
  • 举报
回复
已修改,測試過,可用

Private Declare Function GetSystemMenu Lib "User32" (ByVal hwnd As Integer, ByVal bRevert As Long) As Integer
Private Declare Function RemoveMenu Lib "User32" (ByVal hMenu As Integer, ByVal nPosition As Integer, ByVal wFlags As Integer) As Integer
Private Declare Function DrawMenuBar Lib "User32" (ByVal hwnd As Integer) As Integer
Private Declare Function GetMenuItemCount Lib "User32" (ByVal hMenu As Integer) As Integer
Private Const MF_BYPOSITION = &H400&
Private Const MF_DISABLED = &H2&



Private Sub closeX(ByVal wnd As Form)
Dim hMenu As Integer, nCount As Integer
hMenu = GetSystemMenu(wnd.Handle.ToInt32, 0)
nCount = GetMenuItemCount(hMenu)
MsgBox(nCount)
Call RemoveMenu(hMenu, nCount - 1, MF_DISABLED Or MF_BYPOSITION)
DrawMenuBar(Me.Handle.ToInt32)
End Sub



Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

closeX(Me)

End Sub
rainmyheart 2002-12-24
  • 打赏
  • 举报
回复
受之有愧,受之有愧矣!

NaZiChong(ZiChong)的方法高明多了! 受益非淺!
NaZiChong 2002-12-24
  • 打赏
  • 举报
回复
我不知道楼主的用意到底是如何?

就你的这段代码,只是让“X”变灰,并不能保证用户关掉此窗体,比如用户还是可以通过按Alt+F4进行关闭,或者其他应用程序通过发送关闭窗体消息关闭等等。

我写的这段代码是通过截取关闭窗口的消息来阻止关闭窗口。

请三思!
leaf4646 2002-12-24
  • 打赏
  • 举报
回复
to rainmyheart(水滴)
出来了,谢谢!
NaZiChong 2002-12-23
  • 打赏
  • 举报
回复
不好意思,最近一直在玩c#,所以...
应该是这样:
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Dim SC_CLOSE As Integer = 61536
Dim WM_SYSCOMMAND As Integer = 274

If m.Msg = WM_SYSCOMMAND AndAlso m.WParam.ToInt32 = SC_CLOSE Then
'用户按了“X”
Exit Sub
End If
MyBase.WndProc(m)

End Sub
NaZiChong 2002-12-23
  • 打赏
  • 举报
回复
在Form1里重载WndProc函数,手工处理点击"X"按钮的事件,即在Form1中添加如下代码:

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Dim SC_CLOSE As Integer = 61536
Dim WM_SYSCOMMAND As Integer = 274

If m.Msg = WM_SYSCOMMAND AndAlso m.WParam.ToInt32 = SC_CLOSE Then
//用户按了“X”
End If

End Sub

这样就能够让用户在点击"X"按钮的时候不关闭窗口了。
leaf4646 2002-12-23
  • 打赏
  • 举报
回复
form属性里有控制最大化,最小化的按扭,关闭按扭恐怕只能在程序代码里编了。
shinhwa1028 2002-12-23
  • 打赏
  • 举报
回复
我记得form属性里有一个选项可以控制这些按钮,你找找,我忘了
leaf4646 2002-12-23
  • 打赏
  • 举报
回复
我的意思是让关闭按扭变灰,根本不能点击。
leaf4646 2002-12-21
  • 打赏
  • 举报
回复
我现在将我的原代码改为:

Private Declare Auto Function GetSystemMenu Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal bRevert As Long) As IntPtr
Private Declare Ansi Function RemoveMenu Lib "user32.dll" (ByVal hMenu As IntPtr, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Declare Function DrawMenuBar Lib "User32" (ByVal hwnd As IntPtr) As Long
Private Declare Function GetMenuItemCount Lib "User32" (ByVal hMenu As IntPtr) As Long
Private Const MF_BYPOSITION = &H400&
Private Const MF_DISABLED = &H2&
Private Sub Form_Load()

Call closeX(Me)
End Sub

Private Sub closeX(ByVal Frm As Form)
Dim hMenu As IntPtr, nCount As Long

hMenu = GetSystemMenu(Frm.Handle, 0)
ncount = GetMenuItemCount(hmenu)
Call RemoveMenu(hmenu, ncount - 1, MF_DISABLED Or MF_BYPOSITION)
DrawMenuBar(Frm.Handle)

执行后虽然没有提示错误信息,但是无效的,仍然不然实现让窗体关闭按扭失效的功能。请问哪位可以帮我解决这个问题。谢谢!
leaf4646 2002-12-21
  • 打赏
  • 举报
回复
还是没做出来,请问能不能说得再明白点,最好给点代码。
Donmi 2002-12-21
  • 打赏
  • 举报
回复
窗口句柄现不叫hWnd,而是Handle,如frm.Handle
leaf4646 2002-12-20
  • 打赏
  • 举报
回复
请问该怎么修改?
leaf4646 2002-12-20
  • 打赏
  • 举报
回复
老是提示错误信息:hwnd不是frm的成员。
cwsheng 2002-12-20
  • 打赏
  • 举报
回复
我用过的呀,方法和你上面的一样,怎么不行吗?
Private Declare Auto Function GetSystemMenu Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal bRevert As Long) As IntPtr
Private Declare Ansi Function RemoveMenu Lib "user32.dll" (ByVal hMenu As IntPtr, ByVal nPosition As Long, ByVal wFlags As Long) As Long

16,721

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧