游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2957|回复: 1

请教VB热键控制的写法

[复制链接]

5

主题

7

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2007-1-6 09:47:00 | 显示全部楼层 |阅读模式
经参考ckz727的发言
http://www.vbgood.com/viewthread.php?tid=47645&extra=page%3D9
以及VB心得笔记
http://www.hosp.ncku.edu.tw/~cww/html/keyboard.html

想请教下列程序框框中(ctrl+2为不勾选,ctrl+3为勾选)
要如何只按ctrl+3(同一个热键)就可以切换勾选和不勾选

'以下在.Bas
Option Explicit

'用以告诉系统当这个窗口的msg事件发生时 执行lpPrevWndFunc
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
'lpPrevWndFunc执行函数的地址
'hwnd 就是窗口的hwnd属性
'Msg就是信息 例如按下鼠标器右键 最大化...
'wParam,lParam会因Msg不同而有不同的用途

'取得可用的id
Declare Function GlobalAddAtom Lib "kernel32" Alias "GlobalAddAtomA" (ByVal lpString As String) As Integer
'lpString 传入任意字串 传回值为可用的id

'用以设置窗口的程序
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
'hwnd 就是所要设置窗口的hwnd属性
'nIndex 是要设置的程序
'dwNewLong 所指定的程序(nIndex)所要执行的动作

'用以向系统注册热键 当热键按下时 系统会将WM_HOTKEY这个信息传过来
Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, _
ByVal id As Long, _
ByVal fsModifiers As Long, _
ByVal vk As Long) As Long
'hwnd 就是窗口的hwnd属性
'id可以随便填,只要不重复的话...保险起见是使用GlobalAddAtom取得未使用的id
'fsModifiers 指定按下ALT CTRL 或SHIFT键
Public Const MOD_ALT = &H1
Public Const MOD_CONTROL = &H2
Public Const MOD_SHIFT = &H4
'vk是按键的VK码

'取消热键
Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long

Public Const GWL_WNDPROC = (-4)
Public Const WM_HOTKEY = &H312

Function WndProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim lResult As Long
If uMsg = WM_HOTKEY Then '??徭I按下?r
Form1.WindowState = 0
---------------------------------------------------------------
| If wParam = AppId1 Then                        
| Form1.Check1.Value = 1 '按ctrl+3?楣催x   
| ElseIf wParam = AppId Then                    
| Form1.Check1.Value = 0 '按ctrl+2?椴还催x
| End If                                                   
--------------------------------------------------------------
Else
WndProc = CallWindowProc(PrevWndProc, hwnd, uMsg, wParam, lParam)
'其他信息用原来的回呼函数处理
End If
End Function

'以下在 Form
Option Explicit
Private Sub Form_Load()
Dim lResult As Long
AppId = GlobalAddAtom("Honey") '向系统取得第一组可用id
AppId1 = GlobalAddAtom("Honey1") '向系统取得第二组可用id

lResult = RegisterHotKey(Form1.hwnd, AppId, MOD_CONTROL, vbKey2)
lResult = RegisterHotKey(Form1.hwnd, AppId1, MOD_CONTROL, vbKey3)
'设置两组热键 分别是Ctrl+2和Ctrl+3
'当按下这两组按键时 系统会传WM_HOTKEY信息
'给所热键所注册的窗口 此时是Form1

PrevWndProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WndProc)
'设置新的回呼函式 以拦截信息
'note: 传回值PrevWndProc是原来窗口的回呼函数
'WndProc函数放在模组 因为AddressOf只能取得模组下函数的地址
End Sub

Private Sub Form_Unload(Cancel As Integer)
Dim lResult As Long
lResult = SetWindowLong(Me.hwnd, GWL_WNDPROC, PrevWndProc)
'结束时归还原来的回呼函数 不然会死机

lResult = UnregisterHotKey(Me.hwnd, AppId)
lResult = UnregisterHotKey(Me.hwnd, AppId1)
'取消热键
End Sub

88

主题

1125

帖子

1136

积分

金牌会员

Rank: 6Rank: 6

积分
1136
QQ
发表于 2007-3-16 00:44:00 | 显示全部楼层

Re: 请教VB热键控制的写法



Function WndProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim lResult As Long
If uMsg = WM_HOTKEY Then '??徭I按下?r
Form1.WindowState = 0
---------------------------------------------------------------
| If wParam = AppId1 Then                        
| Form1.Check1.value = 1 '按ctrl+3?楣催x   
| ElseIf wParam = AppId Then                    
| Form1.Check1.value = 0 '按ctrl+2?椴还催x
  '此处加上代码.
  else if wParam=AppId3 then
    if Form1.check1.value=1 then Form1.check1.value=0
    if form1.check1.value=0 then form1.check1.value=1
  ''''''
| End If                                                   
--------------------------------------------------------------
Else
WndProc = CallWindowProc(PrevWndProc, hwnd, uMsg, wParam, lParam)
'其他信息用原来的回呼函数处理
End If
End Function

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 17:59

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表