打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
给VB.net程序加上全局热键功能
1.定义一些必要的API函数、常量和变量
Public Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As Integer, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Integer
    Public Declare Function UnregisterHotKey Lib "user32" (ByVal hWnd As Integer, ByVal id As Integer) As Integer

    Public Const WM_HOTKEY As Short = &H312S
    Public Const MOD_ALT As Short = &H1S
    Public Const MOD_CONTROL As Short = &H2S
    Public Const MOD_SHIFT As Short = &H4S

    Public preWinProc As Integer
    Public uVirtKey1, Modifiers, idHotKey As Integer

    Public Structure taLong
        Dim ll As Integer
    End Structure

    Public Structure t2Int
        Dim lWord As Short
        Dim hword As Short
    End Structure

2.先注册热键
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim ret As Integer

        idHotKey = 100 ''in the range &h0000 through &hBFFF
        Modifiers = MOD_ALT ''辅助键为Alt
        uVirtKey1 = System.Windows.Forms.Keys.D  ''注册的热键为Alt+D
        '注册热键
        ret = Module1.RegisterHotKey(Me.Handle.ToInt32, idHotKey, Modifiers, uVirtKey1)
        If ret = 0 Then
            MsgBox("注册热键失败,请使用其它热键!", MsgBoxStyle.Critical, "错误")
        End If
    End Sub
记得在窗体关闭时注销热键哦!!!
    Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
        Module1.UnregisterHotKey(Me.Handle.ToInt32, uVirtKey1)
    End Sub
3.然后展开窗体代码页最上面那一句“Windows 窗体设计器生成的代码”,找到其中New的那一段,在这一段后面加上这么一个函数(其实哪里都行,只是我喜欢放在这里 ^_^)
<System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _
        Protected Overrides Sub WndProc(ByRef m As Message)
        Dim lp As taLong
        Dim i2 As t2Int
        Dim TempData As String
        ' Listen for operating system messages
        Select Case (m.Msg)
            ' The WM_ACTIVATEAPP message occurs when the application
            ' becomes the active application or becomes inactive.
        Case WM_HOTKEY
                MsgBox("HotKey1")
                If m.WParam.ToInt32 = idHotKey Then
                    lp.ll = m.LParam.ToInt32

                    i2.lWord = lp.ll And &HFFFF
                    i2.hword = (lp.ll And &HFFFF0000) >> 16

                    MsgBox(i2.hword.ToString & "," & i2.lWord)

                    If (i2.lWord = Modifiers) And i2.hword = uVirtKey1 Then
                        If System.Windows.Forms.Clipboard.GetDataObject.GetDataPresent(System.Windows.Forms.DataFormats.Text) Then   '这一段的判断好像不是很准确,我还没仔细研究,不好意思了哦
                            TempData = System.Windows.Forms.Clipboard.GetDataObject.GetData(System.Windows.Forms.DataFormats.Text)
                        End If

                        MsgBox("剪贴板中的数据是文本格式的!" & vbCrLf & "内容为: " & TempData)
                    End If
                End If
        End Select
        MyBase.WndProc(m)
    End Sub


  • 摘要:如何设置VB.NET窗体的全局热键(快捷键),很多人都为这个头疼,看到网上有很多的例子,但是都感觉好复杂,越看越糊涂。经过笔者的研究,把代码做了最简化的处理,使您一看就明白。本文使用API函数注册热键表,下面代码可以直接复制运行,不用做任何修改,方便您测试学习。关于半全局热键(只对一个窗体或控件集有效)的定义,我在另一篇博文中有说明(章鱼哥出品—VB.Net自定义快捷键详解之半全局快捷键)<p></p><p>'***************
  • 如何设置VB.NET 窗体的全局热键(快捷键),很多人都为这个头疼,看到网上有很多的例子,但是都感觉好复杂,越看越糊涂。经过笔者的研究,把代码做了最简化的处理,使您一看就明白。本文使用API函数注册热键表,下面代码可以直接复制运行,不用做任何修改,方便您测试学习。

    关于半全局热键(只对一个窗体或控件集有效)的定义,我在另一篇博文中有说明(章鱼哥出品—VB.Net 自定义快捷键详解之半全局快捷键)

    <p></p><p>'********************************************************************************  </p>'作者:章鱼哥  QQ:3107073263 群:309816713  '需要源码或是有好的建议请联系我'主要内容:'       利用API函数设置全局热键(快捷键)的流程和实现'实现功能:'      按下Shift+Q时 触发Button1的Click事件'     按下Ctrl+D时,触发Button2的Click事件'*********************************************************************************  Public Class Form1    '声明注册热键API函数    Public Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As Integer, ByVal id As Integer,                                                    ByVal fsModifiers As Integer, ByVal vk As Integer) As Integer    '声明注销热键API函数    Public Declare Function UnregisterHotKey Lib "user32" (ByVal hWnd As Integer, ByVal id As Integer) As Integer    Public Const WM_HOTKEY As Short = &H312S '热键消息ID,此值固定,不能修改    Public Const MOD_ALT As Short = &H1S  'ALT按键ID    Public Const MOD_CONTROL As Short = &H2S  'Ctrl    Public Const MOD_SHIFT As Short = &H4S  'Shift    Public uVirtKey1, Modifiers, idHotKey As Integer    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load        idHotKey = 1 '注册的热键的消息ID,这个值可以随便定义,只要与下面两个参数对应即可        Modifiers = MOD_SHIFT '辅助键为Shift        uVirtKey1 = Keys.Q   '注册的热键为Shift+Q        '注册热键        RegisterHotKey(Me.Handle.ToInt32, idHotKey, Modifiers, uVirtKey1) '注册的热键为Shift+Q        RegisterHotKey(Me.Handle.ToInt32, 2, MOD_CONTROL, Keys.D) '注册的热键为Ctrl+D。这里和上步一样,我把参数直接写了,没有先赋值,相信大家都明白    End Sub    '窗体的消息处理函数    Protected Overrides Sub WndProc(ByRef m As Message)        If m.Msg = WM_HOTKEY Then '判断是否为热键消息            Select Case m.WParam.ToInt32 '判断热键消息的注册ID                Case 1                    Button1_Click(Nothing, Nothing) 'Shift+Q                Case 2                    Button2_Click(Nothing, Nothing) 'Ctrl+D            End Select        End If        MyBase.WndProc(m) '循环监听消息    End Sub    '按钮1的Click事件    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click        TextBox1.Text = "此时触发按钮1,快捷键" & Button1.Text    End Sub    '按钮2的Click事件    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click        TextBox1.Text = "此时触发按钮2,快捷键" & Button2.Text    End Sub    '最后别忘记注销热键哦    Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing        UnregisterHotKey(Me.Handle.ToInt32, uVirtKey1)        UnregisterHotKey(Me.Handle.ToInt32, Keys.D)    End SubEnd Class

    代码实现效果截图:


    问题:本来是想使用Application.AddMessageFilter 方法的,但是后来发现单个按键的快捷键还能实现,但是组合快捷键就不容易实现了,有大神实现的,请赐教

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
VB6.0实现将窗体最小化到托盘区
VB实用代码,收藏!!
用VB6编写强力的windows隐藏引擎
vb访问SQL Server 的几种常用方法
VB.NET 2005编写定时关机程序
VB编外挂的一些基础知识
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服