ScreenShot

24/08/2007 - 16:10 von Manfred | Report spam
Hallo,

die letzten tage habe ich damit verbracht ein Programm zu schreiben, mit dem
man Screenshots machen kann. Nun möchte ich jedoch auch haben, dass mein
Programm bei druck auf die Taste <druck> startet. Alle Beispiele, die ich
gefunden habe zeigen, wie man sich einen Hotkey registriert in Kombination
mit Strg oder Alt, ich habe nichts für Druck gefunden. Außerdem möchte ich
das das Programm mehrere verschiedene Funktionen hat auch andere Hotkeys in
Kombination mit Druck bereitstellen können. Wie mache ich das?

Gruß
M. Lutterbach
 

Lesen sie die antworten

#1 Karsten Sosna
26/08/2007 - 06:11 | Warnen spam
"Manfred" schrieb im Newsbeitrag
news:
^^^^^^^^^^^^
Hier sollte der volle Name(Vor- und Zuname) stehen.

die letzten tage habe ich damit verbracht ein Programm zu schreiben, mit
dem
man Screenshots machen kann. Nun möchte ich jedoch auch haben, dass mein
Programm bei druck auf die Taste <druck> startet. Alle Beispiele, die ich
gefunden habe zeigen, wie man sich einen Hotkey registriert in Kombination
mit Strg oder Alt, ich habe nichts für Druck gefunden. Außerdem möchte ich
das das Programm mehrere verschiedene Funktionen hat auch andere Hotkeys
in
Kombination mit Druck bereitstellen können. Wie mache ich das?



Hallo Manfred,
versuch es mal mit einem KeyBoard-Hook.
\\\
Imports System.Runtime.InteropServices
Imports System.Reflection

Public Class Keyboard
Private Declare Function UnhookWindowsHookEx Lib "user32" ( _
ByVal hHook As IntPtr) As Boolean

Private Declare Function SetWindowsHookEx Lib "user32" Alias
"SetWindowsHookExA" ( _
ByVal idHook As Integer, _
ByVal lpfn As KeyboardHookDelegate, _
ByVal hmod As IntPtr, _
ByVal dwThreadId As IntPtr) As IntPtr

Private Declare Function GetAsyncKeyState Lib "user32" ( _
ByVal vKey As Integer) As Integer

Private Declare Function CallNextHookEx Lib "user32" ( _
ByVal hHook As IntPtr, _
ByVal nCode As Integer, _
ByVal wParam As Integer, _
ByRef lParam As KBDLLHOOKSTRUCT) As Integer

Private Delegate Function KeyboardHookDelegate( _
ByVal Code As Integer, _
ByVal wParam As Integer, _
ByRef lParam As KBDLLHOOKSTRUCT) As Integer

<MarshalAs(UnmanagedType.FunctionPtr)> _
Private Callback As KeyboardHookDelegate

Private Structure KBDLLHOOKSTRUCT
Public VKCode As Integer
Public ScanCode As Integer
Public Flags As Integer
Public Time As Integer
Public ExtraInfo As Integer
End Structure

' Low-Level Keyboard Constants
Private Const HC_ACTION As Integer = 0
Private Const LLKHF_EXTENDED As Integer = &H1
Private Const LLKHF_INJECTED As Integer = &H10
Private Const LLKHF_ALTDOWN As Integer = &H20
Private Const LLKHF_UP As Integer = &H80

' Virtual Keys
Private Const VK_TAB As Integer = &H9
Private Const VK_CONTROL As Integer = &H11
Private Const VK_ESCAPE As Integer = &H1B
Private Const VK_DELETE As Integer = &H2E
Private Const WH_KEYBOARD_LL As Integer = 13&

Private KeyboardHandle As IntPtr

' Implement this function to block as many
' key combinations as you'd like
Private Function Hooked(ByRef Hookstruct As KBDLLHOOKSTRUCT) As Boolean
Console.WriteLine("Hookstruct.VKCode: " & Hookstruct.VKCode)
Console.WriteLine("Hookstruct.ScanCode: " & Hookstruct.ScanCode)
If (Hookstruct.Flags And LLKHF_UP) = LLKHF_UP Then
Console.WriteLine("Key up")
Else
Console.WriteLine("Key down")
End If
If (Hookstruct.VKCode = VK_ESCAPE) And
CBool(GetAsyncKeyState(VK_CONTROL) And &H8000) Then
Console.WriteLine("Ctrl + Esc blocked")
Return True
End If
If (Hookstruct.VKCode = VK_TAB) And CBool(Hookstruct.Flags And
LLKHF_ALTDOWN) Then
Console.WriteLine("Alt + Tab blocked")
Return True
End If
If (Hookstruct.VKCode = VK_ESCAPE) And CBool(Hookstruct.Flags And
LLKHF_ALTDOWN) Then
Console.WriteLine("Alt + Escape blocked")
Return True
End If
Return False
End Function

Private Function KeyboardCallback(ByVal Code As Integer, ByVal wParam As
Integer, ByRef lParam As KBDLLHOOKSTRUCT) As Integer
If Code = HC_ACTION Then
If Hooked(lParam) Then
Return 1
End If
End If
Return CallNextHookEx(KeyboardHandle, Code, wParam, lParam)
End Function

Public Sub HookKeyboard()
Callback = New KeyboardHookDelegate(AddressOf KeyboardCallback)
KeyboardHandle = SetWindowsHookEx( _
WH_KEYBOARD_LL, Callback, _
Marshal.GetHINSTANCE( _
[Assembly].GetExecutingAssembly.GetModules()(0)), IntPtr.Zero)
End Sub

Public Function IsHooked() As Boolean
Return KeyboardHandle <> IntPtr.Zero
End Function

Public Sub UnhookKeyboard()
If IsHooked() Then
Call UnhookWindowsHookEx(KeyboardHandle)
End If
End Sub
End Class
///
Aufruf:
\\\
Private KB As New Keyboard
...
KB.HookKeyboard
...
KB.UnHookKeyboard
///
Die Print-Statements habe ich zum testen dringelassen, genauso wie man
Tastaturkombinationen blocken kann, z.B. Ctrl + Esc, da wird normal das
Startmenü mit geöffnet.
Gruß Scotty

Ähnliche fragen