Quantcast
Channel: VBForums - Visual Basic .NET
Viewing all articles
Browse latest Browse all 27085

Listview of global hotkeys

$
0
0
How can I code a listview where I will be able to register global hotkey's. When each global hotkey is presses the 3rd column's pass string should be copied to the clipboard.
Name:  form.png
Views: 33
Size:  13.1 KB

This is the code i have so far.
Code:

Public Class Form1
    <System.Runtime.InteropServices.DllImport("user32.dll")> Public Shared Function GetAsyncKeyState(ByVal vKey As System.Windows.Forms.Keys) As Short
    End Function
    Dim sks As String = "8-BckSpc;9-Tab;13-Enter;16-Shft;17-Ctrl;18-Alt;33-PgUp;34-PgDn;35-End;36-Home;37-Left;38-Up;39-Right;40-Down;45-Ins;46-Del;112-F1;113-F2;114-F3;115-F4;116-F5;117-F6;118-F7;119-F8;120-F9;121-F10;122-F11;123-F12;"
    Dim fcombo(3), combo(3), fcnt, kcnt As Integer
    Dim nochk As Boolean = False
    Dim blnAdd As Boolean 'indicator if add button was pressed
    Dim addcount As Integer = 0
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Timer1.Interval = 100
        Timer1.Start()

    End Sub

    Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
        addcount = addcount + 1
        If addcount >= 2 Then
            For x = 0 To 3
                combo(x) = 0
            Next
            kcnt = 0
        End If
            If btnAdd.Text.ToLower() = "add" Then 'if caption is ADD then perform Add process
                txtName.Enabled = True
                txtHk.Enabled = True
                txtPass.Enabled = True
                btnAdd.Text = "Save"
                btnEdit.Text = "Cancel"
                btnDelete.Enabled = False
                txtName.Text = ""
                txtHk.Text = ""
                txtPass.Text = ""
                blnAdd = True

            Else 'save process
                txtName.Enabled = False
                txtHk.Enabled = False
                txtPass.Enabled = False
                btnAdd.Text = "Add"
                btnEdit.Text = "Edit"
                btnDelete.Enabled = True

                If blnAdd = True Then
                    AddItemToListView()
                Else
                    EditItemInListView()
                End If

            End If
    End Sub

    Private Sub AddItemToListView()
        'Usually the first unique colum is the root item
        Dim lv As BetterListViewItem = ListView1.Items.Add(txtName.Text)
        'The remaining columns are subitems
        lv.SubItems.Add(txtHk.Text)
        lv.SubItems.Add(txtPass.Text)
    End Sub

    Private Sub EditItemInListView()
        If ListView1.SelectedItems.Count > 0 Then 'make sure there is a selected item to modify
            ListView1.SelectedItems(0).Text = txtName.Text
            ListView1.SelectedItems(0).SubItems(1).Text = txtHk.Text
            ListView1.SelectedItems(0).SubItems(2).Text = txtPass.Text
        End If
    End Sub

    Private Sub btnEdit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEdit.Click
        If txtName.Text.Length > 0 Then
            If btnEdit.Text.ToLower() = "edit" Then 'if caption is EDIT then perform EDIT process
                txtName.Enabled = True
                txtHk.Enabled = True
                txtPass.Enabled = True
                btnAdd.Text = "Save"
                btnEdit.Text = "Cancel"
                btnDelete.Enabled = False
                blnAdd = False
            Else 'cancel process
                txtName.Enabled = False
                txtHk.Enabled = False
                txtPass.Enabled = True
                btnAdd.Text = "Add"
                btnEdit.Text = "Edit"
                btnDelete.Enabled = True
            End If
        Else
            MessageBox.Show("Please select record to edit")
        End If
    End Sub

    Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click
        If ListView1.SelectedItems.Count > 0 AndAlso MessageBox.Show("Do you want to delete this item?", "Confirm", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then 'make sure there is a selected item to delete
            ListView1.SelectedItems(0).Remove()
        End If
    End Sub

    Private Sub ListView1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListView1.SelectedIndexChanged
        If ListView1.SelectedItems.Count > 0 Then
            txtName.Text = ListView1.SelectedItems(0).Text
            txtHk.Text = ListView1.SelectedItems(0).SubItems(1).Text
            txtPass.Text = ListView1.SelectedItems(0).SubItems(2).Text
        End If
    End Sub

    Private Sub txtHk_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtHk.KeyDown
        If Not combo.Contains(e.KeyValue) And kcnt < 4 Then
            If kcnt > 0 Then txtHk.Text &= " + "
            Dim fn As Integer = sks.IndexOf(e.KeyValue.ToString & "-")
            If fn > -1 Then
                Dim keystr As String = sks.Substring(fn + 1 + e.KeyValue.ToString.Length)
                keystr = keystr.Remove(keystr.IndexOf(";"))
                txtHk.Text &= keystr
            Else
                txtHk.Text &= Chr(e.KeyValue)
            End If
            combo(kcnt) = e.KeyValue
            kcnt += 1
        End If
    End Sub

    Private Sub txtHk_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtHk.KeyUp
        nochk = True
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If txtHk.Focused = False Then
            Dim x As Integer = 8
            Dim kdwn As Boolean = False
            For x = 8 To 255
                If GetAsyncKeyState(CType(x, Keys)) <> 0 Then
                    kdwn = True
                    If Not fcombo.Contains(x) And fcnt < 4 Then
                        fcombo(fcnt) = x
                        fcnt += 1
                        If nochk = False And kcnt = fcnt And combo.Contains(fcombo(0)) And combo.Contains(fcombo(1)) And combo.Contains(fcombo(2)) And combo.Contains(fcombo(3)) Then
                            MessageBox.Show("Key Combo Pressed")
                       
                        End If
                    End If
                End If
                If x = 159 Then x = 165
            Next
            If kdwn = False And fcnt > 0 Then
                fcnt = 0
                nochk = False
                For c = 0 To 3
                    fcombo(c) = 0
                Next
            End If
        End If
    End Sub
End Class

The changes I need to make are :-
------ Use global hotkey register - But I think I wont be able to use more than one normal character in the combination like( Ctrl + A + S).
------ Iam still not able to check for the hotkey combination in the listview. The correct function should be. If hotkey present in column 2 then do copy pass string from column 3.

Any help would be appreciated.
Attached Images
 

Viewing all articles
Browse latest Browse all 27085

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>