Vb.net Capture Ctrl+C

后端 未结 2 1434
自闭症患者
自闭症患者 2021-01-17 03:15

I want to capture when someone uses CtrlC even when off focus. im using Visual Basic 2010.

相关标签:
2条回答
  • 2021-01-17 03:56

    You need to create a low-level hook. This CodeProject example works perfect and I have used it myself for learning purposes. I modified the code slighty, but here is a simple example of something you could do with that library. Again, this is just an example and may not reflect the final code, but could be easily modified to capture Control+C, and the library is well documented.

       private static bool m_ControlKeyPressed = false;
    
       private static void ControlC_KeyDown(object sender, KeyEventArgs e) {
            if (e.KeyValue == 162 || e.KeyValue == 163) {
                m_ControlKeyPressed = true;
            }
            if (m_ControlKeyPressed) {
                if (e.KeyCode == Keys.C) {
                    e.SuppressKeyPress = true; // Suppress, or do something with it
                }
            }
        }
    
        private static void ControlC_KeyUp(object sender, KeyEventArgs e) {
            if (m_ControlKeyPressed) {
                 if (e.KeyValue == 162 || e.KeyValue == 163) {
                    m_ControlKeyPressed = false;
                }
            }
        }
    

    Conversion to Vb.Net

    Private Shared m_ControlKeyPressed As Boolean = False
    
    Private Shared Sub ControlC_KeyDown(sender As Object, e As KeyEventArgs)
        If e.KeyValue = 162 OrElse e.KeyValue = 163 Then
            m_ControlKeyPressed = True
        End If
        If m_ControlKeyPressed Then
            If e.KeyCode = Keys.C Then
                e.SuppressKeyPress = True
            End If
        End If
    End Sub
    
    Private Shared Sub ControlC_KeyUp(sender As Object, e As KeyEventArgs)
        If m_ControlKeyPressed Then
            If e.KeyValue = 162 OrElse e.KeyValue = 163 Then
                m_ControlKeyPressed = False
            End If
        End If
    End Sub
    
    0 讨论(0)
  • 2021-01-17 04:03

    Okay, so I have a solution for you that I verified works. You will need a C# library though, and a little extra work is required, but not much. Create a C# class library and add a class called 'MyHooks' and add a reference to both System.Windows.Forms.dll and the library I linked you to. Your main program that will use this will reference this C# library and System.Windows.Forms.

    namespace HookManager.Interface {
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Gma.UserActivityMonitor;
    using System.Windows.Forms;
    
    public static class MyHooks {
    
        public static void HookControlC(KeyEventHandler keyDown, KeyEventHandler keyUp) {
            HookManager.KeyDown += keyDown;
            HookManager.KeyUp += keyUp;
        }
    
    }
    }
    

    Now in your program can do something like:

    Imports hookmanager.interface
    Imports System.Windows.Forms
    
    Module Module1
    
    Sub Main()
        MyHooks.HookControlC(AddressOf ControlC_KeyDown, AddressOf ControlC_KeyUp)
    
        While True
            Application.DoEvents()
        End While
    End Sub
    
    Private m_ControlKeyPressed As Boolean = False
    
    Private Sub ControlC_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)
        If e.KeyValue = 162 OrElse e.KeyValue = 163 Then
            m_ControlKeyPressed = True
        End If
        If m_ControlKeyPressed Then
            If e.KeyCode = Keys.C Then
                Console.WriteLine("You captured, control c!")
                Console.WriteLine(Clipboard.GetText())
            End If
        End If
    End Sub
    
    Private Sub ControlC_KeyUp(ByVal sender As Object, ByVal e As KeyEventArgs)
        If m_ControlKeyPressed Then
            If e.KeyValue = 162 OrElse e.KeyValue = 163 Then
                m_ControlKeyPressed = False
            End If
        End If
    End Sub
    
    End Module
    
    0 讨论(0)
提交回复
热议问题