2015-12-24 70 views
1

我做了一个简单的Windows用vb.net窗体应用程序,我的项目“Form1.vb的”的第一个元素包含常见的代码,例如:防止“打印屏幕”在vb.net按钮

Public Class Form1 
    Public Sub Form1_Load 
..... 
End Class 

我需要在我的应用程序禁用“打印屏幕”按钮,我发现使用谷歌下面的代码:

Option Explicit On 

Imports System.ComponentModel 
Imports System.Windows.Forms 
Imports System.Runtime.InteropServices 

Public Class HotKeyClass 
    Inherits Control 

    <DllImport("user32.dll")> _ 
    Private Shared Function RegisterHotKey(hWnd As IntPtr, id As Integer, fsModifiers As Integer, vk As Integer) As Boolean 
    End Function 

    <DllImport("user32.dll")> _ 
    Private Shared Function UnregisterHotKey(hWnd As IntPtr, id As Integer) As Boolean 
    End Function 

    <DllImport("user32.dll", SetLastError:=True)> _ 
    Private Shared Sub keybd_event(bVk As Byte, bScan As Byte, dwFlags As UInteger, dwExtraInfo As Integer) 
    End Sub 

    Public Event HotKeyPressed(Key As Keys, Modifer As HotKeyModifer) 

    Private Const KEYEVENTF_KEYUP = &H2 
    Private Const WM_HOTKEY = &H312 

    Private m_Modifer As Integer 
    Private m_Key As Integer 
    Private m_Id As Integer 

    'Конструктор 
    Sub New() 
     Me.BackColor = Color.Black 
     Me.Visible = False 
    End Sub 

    'Обработка сообщений 
    Protected Overrides Sub WndProc(ByRef m As Message) 
     If m.Msg = WM_HOTKEY Then 
      'Dim idHotKey As Integer = CInt(m.WParam) 'Получаем идентификатор комбинации 
      RaiseEvent HotKeyPressed(m_Key, m_Modifer) 
     End If 

     MyBase.WndProc(m) 
    End Sub 

    'Переопределяем, получаем уникальный ID 
    Public Overrides Function GetHashCode() As Integer 
     Return m_Modifer^m_Key^Me.Handle.ToInt32() 
    End Function 

    'Переопределяем, снять регистрацию клавиш 
    Protected Overrides Sub Dispose(disposing As Boolean) 
     UnregisterHotKey(Me.Handle, Me.GetType().GetHashCode()) 
     MyBase.Dispose(disposing) 
    End Sub 

    'Регистрация клавиш 
    Public Function Register(Key As Keys, Modifer As HotKeyModifer) As Boolean 
     m_Id = Me.GetHashCode() 
     m_Modifer = Modifer 
     m_Key = Key 

     Return RegisterHotKey(Me.Handle, m_Id, m_Modifer, m_Key) 
    End Function 

    'Снять регистрацию клавиш 
    Public Function Unregiser() As Boolean 
     Return UnregisterHotKey(Me.Handle, m_Id) 
    End Function 


    'Для эмуляции нажатия Ctrl + V 
    Public Shared Sub EmulateControlV() 
     keybd_event(Keys.ControlKey, 0, 0, 0) 
     keybd_event(Keys.V, 0, 0, 0) 
     keybd_event(Keys.V, 0, KEYEVENTF_KEYUP, 0) 
     keybd_event(Keys.ControlKey, 0, KEYEVENTF_KEYUP, 0) 
    End Sub 

End Class 

<Flags> _ 
Public Enum HotKeyModifer As UInteger 
    NO_MODIFICATION = 0 
    ALT = 1 
    CONTROL = 2 
    SHIFT = 4 
    WIN = 8 
End Enum 

现在如何使用此代码来检测“屏幕打印”按钮按下,以停止动作?

+1

[禁用打印屏幕命令]的可能重复(http://stackoverflow.com/questions/23485438/disabling-print-screen-command)。另请参阅http://stackoverflow.com/q/3889816/62576 –

+0

对于初学者来说,这不是入门级的东西,你知道该代码的功能,为什么?它最好知道,所以你可以找出**什么不工作,为什么**。此外,如果用户有一个捕获程序,这将不会阻止用户捕获他们想要的东西...只是一个想法... – Codexer

+0

我从来没有新的这么多的VB应用程序守卫**最高机密**的东西,打印屏幕,Windows关闭,键盘和App Exit必须被禁用。 – Plutonix

回答

-2

我已经说过这个位置:https://stackoverflow.com/questions/34238442/how-to-disable-printscreen-functionality-on-32-bit-64-bit-machine/34238923#34238923,但也许它需要重复:-)

可以监视按键,当用户按下打印屏幕(键代码44)执行Clipboard.Clear()。这是毫无意义的,尽管您在应用程序中执行的任何操作都无法阻止用户使用手机拍摄屏幕图像或使用Windows内置的屏幕捕获软件(剪切工具)。