在VB。NET中如何使用热键
请问各位在VB。NET中如何使用热键,如按下*号就就调用BUTTION的CLICK的事件,请贴出例子 问题点数:0、回复次数:16Top
1 楼LongBow007(明朝散发弄扁舟)回复于 2004-08-03 08:16:08 得分 0
upTop
2 楼LongBow007(明朝散发弄扁舟)回复于 2004-08-03 08:16:35 得分 0
看看能不能不用API实现Top
3 楼gdutmo(莫一冰)回复于 2004-08-03 08:30:17 得分 0
各位有例子贴来吗?我是初学,但工程在手啊,急死了,希望各位帮忙!先谢!Top
4 楼zihu928(笨狐狸)回复于 2004-08-03 08:42:53 得分 0
可以这样做:
定义全局的按键响应事件,检测到e.keychar = "*"时就调用button.performclick()方法。Top
5 楼dai2003(天剑)回复于 2004-08-03 08:51:47 得分 0
同意樓上的做法Top
6 楼walkinhill(reaway)回复于 2004-08-03 09:13:35 得分 0
如果你只是想在窗体激活的时候响应按键事件的话,你可以设置Form 的KeyPreview属性为true,然后在Form的Keydown事件里面调用button的单击事件处理函数:
Private Sub frmMain_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
Button2_Click(sender, Nothing)
End Sub
如果你要定义全局热键,就是说要在应用程序没有激活的时候也起作用,你要使用API注册全局键盘钩子函数了。Top
7 楼gdutmo(莫一冰)回复于 2004-08-03 11:05:32 得分 0
我也试过楼上的方法,但我一开始时就设了一个TEXTBOX.SELECT 的。那么当我按下键时是TEXTBOX就会填上*(我设了*为热键)有什么好办法。那个API注册有好例子吗?我是为按钮加热键。Top
8 楼gdutmo(莫一冰)回复于 2004-08-03 11:46:47 得分 0
upTop
9 楼gdutmo(莫一冰)回复于 2004-08-03 11:47:41 得分 0
upTop
10 楼gxlwl(小龙)回复于 2004-08-03 11:48:55 得分 0
给个前人的例子:
'按F10激活窗体
Public Class Form1
Inherits System.Windows.Forms.Form
Private Sub SetF_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AddHotKey(Me.Handle, 1, 0, Keys.F10)
End Sub
Private Sub SetF_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Disposed
DelHotKey(Me.Handle, 1)
End Sub
End Class
Module Module1
'声名委托类型
Delegate Function SubClassProcDelegate(ByVal hwnd As IntPtr, ByVal msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
'引用API
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As IntPtr, ByVal nIndex As Integer, ByVal dwNewinteger As SubClassProcDelegate) As Integer
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Integer, ByVal hwnd As IntPtr, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Private Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As IntPtr, ByVal id As Integer, ByVal fskey_Modifiers As Integer, ByVal vk As Integer) As Integer
Private Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As IntPtr, ByVal id As Integer) As Integer
Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As IntPtr) As Integer
'常量系统热键消息
Const WM_HOTKEY = &H312
'常量窗口函数的地址
Const GWL_WNDPROC = (-4)
Dim preWinProc As Integer
Dim IsWinAddress As Boolean
'下面的function在本进程面始终执行
'并检测窗体是否获得系统热键消息
'获得热键消息就执行SetForegroundWindow(hwnd)
Function keyWndproc(ByVal hwnd As IntPtr, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
If Msg = WM_HOTKEY Then
If wParam = 1 Then 'wParam 值就是 keyID
SetForegroundWindow(hwnd)
End If
End If
'将消息传送给指定的窗口
keyWndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
End Function
Public Sub AddHotKey(ByVal hwnd As IntPtr, ByVal keyID As Integer, ByVal Shift As Integer, ByVal KeyCode As Integer)
'preWinProc得到窗口的地址
'并执行委托函数keyWndproc
preWinProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf keyWndproc)
'注册热键
'热键发生就会把本线程提到系统进程的最前列
RegisterHotKey(hwnd, keyID, Shift, KeyCode)
End Sub
Public Sub DelHotKey(ByVal hwnd As IntPtr, ByVal keyID As Integer)
'删除热键注册
UnregisterHotKey(hwnd, keyID)
End Sub
End ModuleTop
11 楼gdutmo(莫一冰)回复于 2004-08-03 12:32:36 得分 0
这篇文章我也看过但我是新手有点看不懂,如果我要改为为按钮边热键应如何改呢?请各位帮忙!Top
12 楼AntingZ(夕惕若)回复于 2004-08-03 13:03:50 得分 0
把下面代码放到你的窗体代码:
Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean
'考虑到小数字键盘上的*(乘法) 和 Shift+8形成的*
'根据你自己的要求选择需要哪个
If keyData = Keys.Multiply Or keyData = (keyData.Shift Or Keys.D8) Then
MessageBox.Show("You Press ***")
'do something
Return True
End If
End FunctionTop
13 楼gdutmo(莫一冰)回复于 2004-08-03 13:24:00 得分 0
谢,不过我还想知道如果用API 的方法如何做呢?Top
14 楼AntingZ(夕惕若)回复于 2004-08-03 13:37:34 得分 0
都dotNet了,你还念念不忘API
热键API用 RegisterHotKey 和 UnregisterHotKey
还可以用Hook技术,不过那样实在是得不偿失,又麻烦有消耗资源。Top
15 楼gdutmo(莫一冰)回复于 2004-08-03 13:41:44 得分 0
呵呵,因为。NET的基类太大了,对于我的初学者来说重载它们有点烦麻,因为对它们不熟。楼上的朋友,怎样才能学好。NET呢,还请指点一下。Top
16 楼AntingZ(夕惕若)回复于 2004-08-03 13:52:13 得分 0
看书,写代码,碰到不懂的,查MSDN,不详细,
来CSDN搜索,搜不到 ,用Google搜索,还搜不到,来CSDN提问
咿,怎么没人回答,向同学朋友讨教,都不会。
关门,自己研究三天三夜
还不行,晕倒......
----------------------------------------------------
偶也菜鸟一只,没什么高见。偶是这样来学的
Top




