禁掉Alt+Tab键 win98里可以这样做Const SPI_SCREENSAVERRUNNING = 97Private Declare Function SystemParametersInfo Lib "User32" Alias _ "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, lpvParam As _ Any, ByVal fuWinIni As Long) As LongPrivate Sub Command1_Click() Dim pOld As Boolean Call SystemParametersInfo(SPI_SCREENSAVERRUNNING, True, pOld, 0) End SubPrivate Sub Command2_Click() Dim pOld As Boolean Call SystemParametersInfo(SPI_SCREENSAVERRUNNING, False, pOld, 0) End Sub
VB调用API函数使窗口保持在最上层 ,2让窗口拒绝接受键盘和鼠标事件 ---- 我们看到有的应用程序不管窗口是否活动都使窗口保持在最上层,常见的Microsoft Word的文件打开和编辑查找窗口就是这样。在VB开发中可以通过调用SetWindowsPos()API函数实现这个功能。该函数声明如下: Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, _ ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, _ ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long ---- hWnd变元是窗口的句柄;x,y是窗口的左上角的坐标;cx、cy是窗口宽度和高度;hWndInsertAfter变元是窗口清单中hWnd窗口前面的窗口句柄,有四个可选值: 序号 可 选 值 作 用 1 HWND_BOTTOM 把窗口放在窗口清单的底部 2 HWND_TOP 把窗口放在窗口清单的字符顺序的顶部 3 HWND_TOPMOST 把窗口放在窗口清单的顶部 4 HWND_NOTOPMOST 把窗口放在窗口清单的顶部,最上层窗口之下 ---- WFlags变元为整型值,有八个可选值: 序号 可 选 值 作 用 1 SWP_DRAWFRAME 在窗口周围画一个方框 2 SWP_HIDEWINDOW 隐藏窗口 3 SWP_NOACTIVATE 不激活窗口 4 SWP_NOMOVE 保持窗口当前位置 5 SWP_NOREDRAW 窗口不自动重画 6 SWP_NOSIZE 保持窗口当前尺寸 7 SWP_NOZORDER 保持窗口在窗口清单中的当前位置 8 SWP_SHOWWINDOW 显示窗口 ---- 下面的例子程序Test演示了对函数中的以上7个变元作正确的选择后,应用程序运行后窗口总可保持在最上层,程序清单如下: Option Explicit Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, _ ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, _ ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long Private Const HWND_TOPMOST = -1 Private Const SWP_SHOWWINDOWS = &H40Private Sub Form_Load() Dim retValue As Long retValue = SetWindowPos(Me.hwnd, HWND_TOPMOST, Me.CurrentX, _ Me.CurrentY, 300, 300, SWP_SHOWWINDOWS) End Sub ---- 备注:编写函数声明时,整个函数声明须在一行中写完,不可提行。一般是自动从系统中得到函数声明,方法是从VB的外接程序管理中启动“API 浏览”程序,在“API 浏览”程序中找到所需的函数声明,然后复制到VB代码中。 让窗口拒绝接受键盘和鼠标事件
声明: Private Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As Long 使用: '拒绝接受键盘和鼠标事件 Call EnableWindow(Form.hwnd, 0) '允许接受键盘和鼠标事件 Call EnableWindow(Form.hwnd, 1)
对上面的答复进行一下综合: 1、将你要操作的窗口设置为 永远在上(always on top); 2、将鼠标的活动范围控制于当前的窗口上,即鼠标无法移到到窗口外
如何让Window不接受键盘输入及Mouse Click 就好比呼叫MsgBox之後,Form就不接受Mouse Click与KeyPress,但是Form仍可处於Activate的状态,即我们暂停了Mouse Click,KeyPress,等待我们要做事都做完了,再将之回复。不过Mouse仍可自由的移动,若要让Mouse也不能动,就使用JournalPlayBack Hook,而不是使用本方法。EnableWindow()可达目的,第二个叁数传0进入则不能输入,传1则相反Private Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As Long Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Private Sub Command1_Click() Call EnableWindow(Me.hwnd, 0) Me.Caption = "现在拒绝KeyPress, MouseClick" Dim i As Long For i = 1 To 100 Call Sleep(100) DoEvents '虽有DoEvents,会发现,按Form的任何地方都没有反应 Next i Me.Caption = "现在解除了" Call EnableWindow(Me.hwnd, 1) End Sub
win98里可以这样做Const SPI_SCREENSAVERRUNNING = 97Private Declare Function SystemParametersInfo Lib "User32" Alias _
"SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, lpvParam As _
Any, ByVal fuWinIni As Long) As LongPrivate Sub Command1_Click()
Dim pOld As Boolean
Call SystemParametersInfo(SPI_SCREENSAVERRUNNING, True, pOld, 0)
End SubPrivate Sub Command2_Click()
Dim pOld As Boolean
Call SystemParametersInfo(SPI_SCREENSAVERRUNNING, False, pOld, 0)
End Sub
---- 我们看到有的应用程序不管窗口是否活动都使窗口保持在最上层,常见的Microsoft Word的文件打开和编辑查找窗口就是这样。在VB开发中可以通过调用SetWindowsPos()API函数实现这个功能。该函数声明如下: Private Declare Function SetWindowPos
Lib "user32" (ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, ByVal
x As Long, ByVal y As Long, _
ByVal cx As Long, ByVal cy As Long,
ByVal wFlags As Long) As Long
---- hWnd变元是窗口的句柄;x,y是窗口的左上角的坐标;cx、cy是窗口宽度和高度;hWndInsertAfter变元是窗口清单中hWnd窗口前面的窗口句柄,有四个可选值: 序号 可 选 值 作 用
1 HWND_BOTTOM 把窗口放在窗口清单的底部
2 HWND_TOP 把窗口放在窗口清单的字符顺序的顶部
3 HWND_TOPMOST 把窗口放在窗口清单的顶部
4 HWND_NOTOPMOST 把窗口放在窗口清单的顶部,最上层窗口之下
---- WFlags变元为整型值,有八个可选值: 序号 可 选 值 作 用
1 SWP_DRAWFRAME 在窗口周围画一个方框
2 SWP_HIDEWINDOW 隐藏窗口
3 SWP_NOACTIVATE 不激活窗口
4 SWP_NOMOVE 保持窗口当前位置
5 SWP_NOREDRAW 窗口不自动重画
6 SWP_NOSIZE 保持窗口当前尺寸
7 SWP_NOZORDER 保持窗口在窗口清单中的当前位置
8 SWP_SHOWWINDOW 显示窗口
---- 下面的例子程序Test演示了对函数中的以上7个变元作正确的选择后,应用程序运行后窗口总可保持在最上层,程序清单如下: Option Explicit
Private Declare Function SetWindowPos
Lib "user32" (ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long,
ByVal x As Long, ByVal y As Long, _
ByVal cx As Long, ByVal cy As Long,
ByVal wFlags As Long) As Long
Private Const HWND_TOPMOST = -1
Private Const SWP_SHOWWINDOWS = &H40Private Sub Form_Load()
Dim retValue As Long
retValue = SetWindowPos(Me.hwnd,
HWND_TOPMOST, Me.CurrentX, _
Me.CurrentY, 300, 300, SWP_SHOWWINDOWS)
End Sub
---- 备注:编写函数声明时,整个函数声明须在一行中写完,不可提行。一般是自动从系统中得到函数声明,方法是从VB的外接程序管理中启动“API 浏览”程序,在“API 浏览”程序中找到所需的函数声明,然后复制到VB代码中。 让窗口拒绝接受键盘和鼠标事件
声明:
Private Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As Long
使用:
'拒绝接受键盘和鼠标事件
Call EnableWindow(Form.hwnd, 0)
'允许接受键盘和鼠标事件
Call EnableWindow(Form.hwnd, 1)
1、将你要操作的窗口设置为 永远在上(always on top);
2、将鼠标的活动范围控制于当前的窗口上,即鼠标无法移到到窗口外
复杂的可用 zmcpu(CPU)
這是那里出錯呢?因為VB對我來說比較陌生﹐我不知道zmcpu(CPU)說到的程序中出現的:Call EnableWindow(Form.hwnd, 0)
當中的form是指的一個類還是具體我所在的form的名稱呢???
寫法上有什么不同??(最好是能定位在當前的excel上屏蔽鼠標和鍵盤的響應﹐具體有什么變化????)
就好比呼叫MsgBox之後,Form就不接受Mouse Click与KeyPress,但是Form仍可处於Activate的状态,即我们暂停了Mouse Click,KeyPress,等待我们要做事都做完了,再将之回复。不过Mouse仍可自由的移动,若要让Mouse也不能动,就使用JournalPlayBack Hook,而不是使用本方法。EnableWindow()可达目的,第二个叁数传0进入则不能输入,传1则相反Private Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Private Sub Command1_Click()
Call EnableWindow(Me.hwnd, 0)
Me.Caption = "现在拒绝KeyPress, MouseClick"
Dim i As Long
For i = 1 To 100
Call Sleep(100)
DoEvents '虽有DoEvents,会发现,按Form的任何地方都没有反应
Next i
Me.Caption = "现在解除了"
Call EnableWindow(Me.hwnd, 1)
End Sub
首先感謝: zmcpu(CPU) 大哥的幫忙。
請問zmcpu(CPU)﹕正如你所說的﹐在VB的form中﹐上面的程序的確沒有什么問題﹐但是當我把上面的方法移植到vba對excel編程的時候卻老是不成功﹐老是提示調用的函數沒有定義﹐另外我對VBA的編程比較陌生﹐希望: zmcpu(CPU) 能對我的問題做出比較詳細的解答。再次感謝各位