vb怎样设置窗体充满屏幕(盖住状态栏)?

gene_huang 2011-05-06 10:44:47
vb怎样设置某“警告窗体”充满屏幕(盖住状态栏),并且总是在最前,没有控制栏?同时要求用户操作键盘和鼠标对电脑都没影响,当此某“警告窗体”被关闭后用户才能正常操作。
...全文
371 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
gene_huang 2011-11-30
  • 打赏
  • 举报
回复
感谢大家的热心帮助,结贴给分!
zs_5733 2011-05-08
  • 打赏
  • 举报
回复
调用api函数是可以实现的,比如屏蔽右下角状态栏部分是可以是新,vb.net可以啊
独立级IT民工 2011-05-08
  • 打赏
  • 举报
回复
Form1窗体

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim sbfm As MsgboxForm
sbfm = New MsgboxForm()
sbfm.ShowDialog()

End Sub

End Class



MsgboxForm警告窗体


Imports WinFromHook.FormHook
Imports Microsoft.Win32

Public Class MsgboxForm
Dim hhkLowLevelKybd As Long
Public KeyBoardHookProcedure As HookProc
Dim fh As FormHook

Private Sub MsgboxForm_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
FormBorderStyle = Windows.Forms.FormBorderStyle.None
Me.WindowState = FormWindowState.Maximized
Button1.Text = "退出"
Button2.Text = "可用"
Label1.Text = "最大化警告窗体屏蔽键盘(Ctrl+Alt+Delete)"
Destroy()

End Sub

Private Sub MsgboxForm_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
If hhkLowLevelKybd <> 0 Then UnhookWindowsHookEx(hhkLowLevelKybd)
End Sub

Public Sub SetCtrlAltDeleteStatus(ByVal value As Integer)

'1不可用 0可用
Dim key As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.CurrentUser
Dim key1 As Microsoft.Win32.RegistryKey = key.CreateSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System")
key1.SetValue("DisableTaskMgr", 1, Microsoft.Win32.RegistryValueKind.DWord)
Dim r As RegistryKey
r = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", True)
If r Is Nothing Then
r = Registry.CurrentUser.CreateSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System")
End If

r.SetValue("DisableTaskMgr", value, RegistryValueKind.DWord)
End Sub

Private Sub Destroy()
fh = New FormHook()
fh.Hook_Start()
Dim handleTaskMask As IntPtr = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Shell_TrayWnd", Nothing)
ShowWindow(handleTaskMask, 0)
Dim handleDeskTop As IntPtr = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Progman", Nothing)
ShowWindow(handleDeskTop, 0)
SetCtrlAltDeleteStatus(1)
Dim p As Boolean = True
SystemParametersInfo(spi_screensaverrunning, 1, p, 0) '关Ctrl+Alt+Del窗口,SystemParametersInfo(97, False, A, 0),uParam为布尔型
End Sub

Private Sub Recover()
fh = New FormHook()
fh.Hook_Clear()
Dim handle As IntPtr = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Shell_TrayWnd", Nothing)
ShowWindow(handle, 1)
Dim handleDeskTop As IntPtr = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Progman", Nothing)
ShowWindow(handleDeskTop, 1)
SetCtrlAltDeleteStatus(0)
Dim p As Boolean = True
SystemParametersInfo(spi_screensaverrunning, 0, p, 0) '开Ctrl+Alt+Del窗口,SystemParametersInfo(97, False, A, 0),uParam为布尔型
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Recover()
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.Close()
End Sub
End Class


类模块 FormHook.vb


Imports System.Runtime.InteropServices

Public Class FormHook
'委托
Public Delegate Function HookProc(ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As IntPtr) As Integer
Public hHook As Integer = 0
Public Const WH_KEYBOARD_LL = 13
'LowLevel键盘截获,如果是WH_KEYBOARD=2,并不能对系统键盘截取,Acrobat Reader会在你截取之前获得键盘。
Public KeyBoardHookProcedure As HookProc
'键盘Hook结构函数
Public Structure KeyBoardHookStruct
Dim vkCode As Integer
Public scanCode As Integer
Public flags As Integer
Public time As Integer
Public dwExtraInfo As Integer
End Structure

'设置钩子
Public Declare Function SetWindowsHookEx Lib "user32.dll" Alias "SetWindowsHookExA" (ByVal idHook As Integer, ByVal lpfn As HookProc, ByVal hInstance As IntPtr, ByVal threadId As Integer) As Integer

'抽掉钩子
Public Declare Function UnhookWindowsHookEx Lib "user32.dll" (ByVal idHook As Integer) As Boolean

'调用下一个钩子
Public Declare Function CallNextHookEx Lib "user32.dll" (ByVal idHook As Integer, ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As IntPtr) As Integer

Public Declare Function GetCurrentThreadId Lib "kernel32.dll" () As Integer

Public Declare Function GetModuleHandle Lib "kernel32.dll" Alias "GetModuleHandleA" (ByVal name As String) As IntPtr

Public Declare Function FindWindowEx Lib "User32.dll" Alias "FindWindowExA" (ByVal ph As IntPtr, ByVal ch As IntPtr, ByVal cn As String, ByVal wn As String) As IntPtr

Public Declare Function ShowWindow Lib "User32.dll" (ByVal hWnd As IntPtr, ByVal nCmdShow As Long) As Boolean

Public Const spi_screensaverrunning As UInteger = 97

Public Declare Function SystemParametersInfo Lib "user32.dll" Alias "SystemParametersInfoA" (ByVal uiAction As UInteger, ByVal uiParam As UInteger, ByRef pvParam As Boolean, ByVal fWinIni As UInteger) As Boolean

'自定义事件
Public Sub Hook_Start()
'安装键盘钩子
If hHook = 0 Then

KeyBoardHookProcedure = New HookProc(AddressOf KeyBoardHookProc)

Dim hInstance As IntPtr
hInstance = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName)

hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure, hInstance, 0)
'如果设置钩子失败.
If hHook = 0 Then
Hook_Clear()
'throw new Exception("设置Hook失败!");
End If
End If
End Sub

'取消钩子事件
Public Sub Hook_Clear()

Dim retKeyboard As Boolean = True
If hHook <> 0 Then
retKeyboard = UnhookWindowsHookEx(hHook)
hHook = 0
End If
'如果去掉钩子失败.
If retKeyboard = False Then Throw New Exception("UnhookWindowsHookEx failed.")
End Sub

'这里可以添加自己想要的信息处理
Public Function KeyBoardHookProc(ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As IntPtr) As Integer

If nCode >= 0 Then

Dim kbh As KeyBoardHookStruct = CType(Marshal.PtrToStructure(lParam, GetType(KeyBoardHookStruct)), KeyBoardHookStruct)

If kbh.vkCode = CInt(Keys.S) And CInt(Control.ModifierKeys) = CInt(Keys.Control) Then ' 截获Ctrl+S
Return 1
End If

If kbh.vkCode = CInt(Keys.Y) And CInt(Control.ModifierKeys) = CInt(Keys.Control) + CInt(Keys.Alt) Then '截获Ctrl+Alt+Y
Return 1
End If

If kbh.vkCode = CInt(Keys.LWin) Then '截获win
Return 1
End If

If kbh.vkCode = CInt(Keys.Tab) And CInt(Control.ModifierKeys) = CInt(Keys.Alt) Then '截获Alt+Tab
Return 1
End If

If kbh.vkCode = CInt(Keys.F4) And CInt(Control.ModifierKeys) = CInt(Keys.Alt) Then '截获Alt + F4
Return 1
End If

If kbh.vkCode = CInt(Keys.E) And CInt(Control.ModifierKeys) = CInt(Keys.LWin) Then '截获win + e
Return 1
End If

If kbh.vkCode = CInt(Keys.Escape) And CInt(Control.ModifierKeys) = CInt(Keys.Alt) Then '截获Alt + esc
Return 1
End If

If CType(Control.ModifierKeys, Integer) = CType(Keys.Control, Integer) + CType(Keys.Alt, Integer) + CType(Keys.Delete, Integer) Then '截获Ctrl+Alt+Delete 不成功
Return 1
End If

If kbh.vkCode = CType(Keys.Escape, Integer) And CType(Control.ModifierKeys, Integer) = CType(Keys.Control, Integer) Then '截获Ctrl + esc
Return 1
End If
End If

Return CallNextHookEx(hHook, nCode, wParam, lParam)
End Function

End Class

独立级IT民工 2011-05-07
  • 打赏
  • 举报
回复
我的思路是:把窗体设置为最前,然后用showdialog来显示警告窗体,当用户按alt+tab 切换到其他应用程序后,用API来捕捉鼠标键盘操作,如果监测到对鼠标键盘有操作的话,则屏蔽这个操作响应。
十八道胡同 2011-05-07
  • 打赏
  • 举报
回复
gene_huang 2011-05-07
  • 打赏
  • 举报
回复

多谢提醒!我现在vb6.0中通过设置窗体属性是可以让“警告窗体”充满整个屏幕(盖住状态栏),并调用API函数setwindowpos使得窗体置顶。按alt+tab 切换到其他应用程序后,原窗体仍然置顶,但状态栏露出来了,用户可以在状态栏上进行操作。看来还得请大虾们解决当“警告窗体”出现时,如何让电脑不响应鼠标键盘动作!“警告窗体”一关闭马上就恢复正常!
cunxinsoft 2011-05-07
  • 打赏
  • 举报
回复
用API把窗口全部拉大,然后把键鼠消息钩子勾住
flfq 2011-05-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gene_huang 的回复:]
多谢提醒!我现在vb6.0中通过设置窗体属性是可以让“警告窗体”充满整个屏幕(盖住状态栏),并调用API函数setwindowpos使得窗体置顶。按alt+tab 切换到其他应用程序后,原窗体仍然置顶,但状态栏露出来了,用户可以在状态栏上进行操作。看来还得请大虾们解决当“警告窗体”出现时,如何让电脑不响应鼠标键盘动作!“警告窗体”一关闭马上就恢复正常!
[/Quote]
让电脑不响应鼠标键盘动作,那怎么恢复?
ycproc 2011-05-07
  • 打赏
  • 举报
回复
这个 你得 不活所有的 键盘和鼠标的 键值
独立级IT民工 2011-05-07
  • 打赏
  • 举报
回复
参考以下链接,希望对你有所帮助:
http://www.programbbs.com/bbs/tree14-26820-143326.htm
http://dotnet.mblogger.cn/chinaly/
十八道胡同 2011-05-06
  • 打赏
  • 举报
回复
要求用户操作键盘和鼠标对电脑都没影响 ,我觉的这个有点难。

我按alt+tab 不能切换?

16,556

社区成员

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

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