怎么用VB检测键盘的状态?急!在线等待!!!
我作了一个VB程序,里面有一个timer控件,到时间运行,我想在里面加上一个检测键盘的语句,如果某个键按下,则运行,否则,不运行,应该怎么做?请高手指点,谢谢!!! 问题点数:60、回复次数:8Top
1 楼light_swing(轻寒)回复于 2002-05-30 16:52:32 得分 5
这个办法试试:
在key_onclick里置一个标志变量
在timer程序里检查这一变量即可Top
2 楼light_swing(轻寒)回复于 2002-05-30 16:54:10 得分 5
哦,该key_down里吧Top
3 楼uv2000()回复于 2002-05-30 18:15:45 得分 10
dim a as long
... XXX XXX ...
time1.enable=true
... key_down ...
if a=1 then
your do
... time1_timer ...
a=1
Top
4 楼uv2000()回复于 2002-05-30 18:16:13 得分 0
dim a as long
... XXX XXX ...
time1.enable=true
... key_down ...
if a=1 then
your do
... time1_timer ...
a=1
Top
5 楼coffee_cn(coffee)回复于 2002-05-30 18:23:28 得分 20
按下某组键(HotKey)便执行某程序
来源:cww
在Dos的年代,我们常会以拦截中断向量的方式,做到按下某个hotkey而自动执行某个程
式,在Window呢,也可以,不过它是用RegisterHotkey API来完成。
使用RegisterHotkey的概念是,它会定义一组按键的组合,当使用者不管在哪个程序之中
,按下Window有注册的HotKey时,OS会传送WM_HOTKEY 的讯息给待接收该讯息的Window,
而该Window收到WM_HOTKEY时,便可知道有本身Thread所定义的HotKey被按下,於是可以
从wParam, lParam来得知是哪一组HotKey被按下。
RegisterHotKey(
ByVal hwnd As Long , //接收Hotkey的Window
ByVal idHotKey as Long, // identifier of hot key,range 0x0000 through 0xBFFF
ByVal Modifiers As Long, // 定义alt shift control等的组合
ByVal uVirtKey As Long // virtual-key code
)
WM_HOTKEY 叁数的定义
idHotKey = wParam; // identifier of hot key
Modifiers = (UINT) LOWORD(lParam); // key-modifier flags
uVirtKey = (UINT) HIWORD(lParam); // virtual-key code
所以了,除了设定RegisterHotkey外,另要使用SubClassing的技巧才会得知HotKey被按
下;最後,程序结束前要使用UnRegisterHotkey将HotKey的定义取消掉。
以下程序功能是:不管在哪个程序中,只要按下ALT-SHIFT-G 便执行NotePad。
'以下在.Bas
Option Explicit
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long
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
Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long
Public Const WM_HOTKEY = &H312
Public Const MOD_ALT = &H1
Public Const MOD_CONTROL = &H2
Public Const MOD_SHIFT = &H4
Public Const GWL_WNDPROC = (-4)
Public preWinProc As Long
Public Modifiers As Long, uVirtKey As Long, idHotKey As Long
Private Type taLong
ll As Long
End Type
Private Type t2Int
lWord As Integer
hword As Integer
End Type
Public Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_HOTKEY Then
If wParam = idHotKey Then
Dim lp As taLong, i2 As t2Int
lp.ll = lParam
LSet i2 = lp
If (i2.lWord = Modifiers) And i2.hword = uVirtKey Then
Debug.Print "HotKey Shift-Alt-G Pressed "
Shell "notepad", vbNormalFocus
End If
End If
End If
'将之送往原来的Window Procedure
wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
End Function
'以下在 Form
Sub Form_Load()
Dim ret As Long
preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc)
idHotKey = 1 'in the range &h0000 through &hBFFF
Modifiers = MOD_ALT + MOD_SHIFT
uVirtKey = vbKeyG
ret = RegisterHotKey(Me.hwnd, idHotKey, Modifiers, uVirtKey)
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim ret As Long
'取消Message的截取,而使之又只送往原来的Window Procedure
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)
Call UnregisterHotKey(Me.hwnd, uVirtKey)
End Sub
Top
6 楼atree_zhang(木依)回复于 2002-05-30 22:10:07 得分 10
不知道说的是不是你说的问题
声明一个变量 KeyStr 为布尔型的
在窗口的keydown 事件中添加以下代码
select case Keycode
case 你所需要的键的码值
keystr=true
case 你不需要的键的码值
keystr=false
.....
end select
在timer中的事件中则判断KeyStr的值来确定是否执行该操作Top
7 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2002-05-30 22:16:43 得分 10
名称:0003.zip
URL:http://202.98.116.66/amtd/aijun/document/0003.zip
大小: 54KB
完成时间:Sun Apr 21 16:48:07 2002
引用页:http://wind.prohosting.com/stock236/tongs/tscctvgssh.zip
注释:2000.09.18 [软件报] - 利用热键操作实现一键通 下载
Top
8 楼hack008(邱少华)回复于 2002-05-30 22:19:10 得分 0
zyl910(910:分儿,我来了!) 多给他点分!!!你太热心了!!!Top
9 楼zry168(暴风雪)回复于 2002-05-30 22:23:18 得分 0
upTop




