AUTO CLICK NO TECLADO

MAZIN 03/09/2009 16:53:26
#321863
Boa tarde,
Estou usando essa API para capturar um click no teclado:

  Imports System.Runtime.InteropServices
Imports Microsoft.VisualBasic.Devices


Public Class Form1
Private WithEvents kbHook As New KeyboardHook

Private Sub kbHook_KeyDown(ByVal Key As System.Windows.Forms.Keys) Handles kbHook.KeyDown
If Key = Keys.F12 Then
MsgBox([Ô]Minha Msg![Ô])
End If
End Sub

End Class



Public Class KeyboardHook
[ô][ô]Constants
Private Const HC_ACTION As Integer = 0
Private Const WH_KEYBOARD_LL As Integer = 13
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101
Private Const WM_SYSKEYDOWN = &H104
Private Const WM_SYSKEYUP = &H105

[ô][ô]Keypress Structure
Private Structure KBDLLHOOKSTRUCT
Public vkCode As Integer
Public scancode As Integer
Public flags As Integer
Public time As Integer
Public dwExtraInfo As Integer
End Structure
[ô][ô]API Functions
Private Declare Function SetWindowsHookEx Lib [Ô]user32[Ô] _
Alias [Ô]SetWindowsHookExA[Ô] _
(ByVal idHook As Integer, _
ByVal lpfn As KeyboardProcDelegate, _
ByVal hmod As Integer, _
ByVal dwThreadId As Integer) As Integer

Private Declare Function CallNextHookEx Lib [Ô]user32[Ô] _
(ByVal hHook As Integer, _
ByVal nCode As Integer, _
ByVal wParam As Integer, _
ByVal lParam As KBDLLHOOKSTRUCT) As Integer

Private Declare Function UnhookWindowsHookEx Lib [Ô]user32[Ô] _
(ByVal hHook As Integer) As Integer

[ô][ô]Our Keyboard Delegate
Private Delegate Function KeyboardProcDelegate _
(ByVal nCode As Integer, _
ByVal wParam As Integer, _
ByRef lParam As KBDLLHOOKSTRUCT) As Integer

[ô][ô]The KeyPress events
Public Shared Event KeyDown(ByVal Key As Keys)
Public Shared Event KeyUp(ByVal Key As Keys)
[ô][ô]The identifyer for our KeyHook
Private Shared KeyHook As Integer
[ô][ô]KeyHookDelegate
Private Shared KeyHookDelegate As KeyboardProcDelegate

Public Sub New()
[ô][ô]Installs a Low Level Keyboard Hook
KeyHookDelegate = New KeyboardProcDelegate(AddressOf KeyboardProc)
KeyHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyHookDelegate, System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly.GetModules()(0)).ToInt32, 0)
End Sub

Private Shared Function KeyboardProc(ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As KBDLLHOOKSTRUCT) As Integer
[ô][ô]If it is a keypress
If (nCode = HC_ACTION) Then
Select Case wParam
[ô][ô]If it is a Keydown Event
Case WM_KEYDOWN, WM_SYSKEYDOWN
[ô][ô]Activates the KeyDown event in Form 1
RaiseEvent KeyDown(CType(lParam.vkCode, Keys))
Case WM_KEYUP, WM_SYSKEYUP
[ô][ô]Activates the KeyUp event in Form 1
RaiseEvent KeyUp(CType(lParam.vkCode, Keys))
End Select
End If
[ô][ô]Next
Return CallNextHookEx(KeyHook, nCode, wParam, lParam)
End Function

Protected Overrides Sub Finalize()
[ô][ô]On close it UnHooks the Hook
UnhookWindowsHookEx(KeyHook)
MyBase.Finalize()
End Sub
End Class

Public Class Mouse
<DllImport([Ô]user32.dll[Ô])> _
Private Shared Sub mouse_event(ByVal dwFlags As UInt32, ByVal dx As UInt32, ByVal dy As UInt32, ByVal dwData As UInt32, ByVal dwExtraInfo As IntPtr)
End Sub

Private Const MouseEventLeftDown As UInt32 = &H2
Private Const MouseEventLeftUp As UInt32 = &H4

Public Shared Sub SendClick()
mouse_event(MouseEventLeftDown, 0, 0, 0, New System.IntPtr)
mouse_event(MouseEventLeftUp, 0, 0, 0, New System.IntPtr)
End Sub
End Class


Neste caso, quando o usuario aperta F12 aparece uma MsgBox escrita [Ô]Minha Msg![Ô] independente do foco no programa (funciona ateh com o programa minimizado).

Agora, eu tentei de tudo quanto e forma. Fiquei o dia inteiro pesquisando na internet uma forma de fazer o seguinte:

Ao clickar, por exemplo, em um botão no formulario é enviado um comando como se estivesse apertando F12 que por fim aparece a msg [Ô]Minha Msg![Ô]. Esse comando precisa ser um click REAL diferente do que eu tentei usando o seguinte:

 My.Computer.Keyboard.SendKeys([Ô]{F12}[Ô]) 


Esse exemplo é baseado em STRING e funciona até certo ponto se vc setar o foco em um txt_box mas não é o que eu quero.

Existe alguma forma de enviar um click real sem precisar de foco funcionando nesta API?



Obrigado desde ja
USUARIO.EXCLUIDOS 03/09/2009 17:36:36
#321868
Você me desculpe mas eu não entendi a necessidade disso. Se você quer que aconteça algo quando se clica no botão, não é só vc colocar no evento do botão pra chamar o metodo??
MAZIN 03/09/2009 18:59:30
#321884
O Botao foi somente um exemplo, nao precisa ser exatamente nele.
Ja tentei de tudo, esse metodo nao atribui a opcao de [Ô]click real[Ô] e eh isso que eu quero...

Se alguem tiver um chute ou um exemplo ficarei grato.
MAZIN 04/09/2009 10:05:05
#321929
Obrigado RCMRO, vou testar e volto a postar os resultados...

Brigadão mesmo pela força
Até +
CALTABIANO 04/09/2009 10:33:15
#321933
Mazin, o uso desta tecnica tem lá suas vantagens e desvantagens principalmente dependendo da finalidade... mas enfim a ideia é ajudar. Tenho um programa que talvés possa te ajudar é só dar uma estuda nele...

Att, Celso.
MAZIN 04/09/2009 10:52:41
#321937
CALTABIANO, vou baixar e testar sua tecnica ver se suas fucionalidades vao servir...

Porem, enquanto isso preciso de uma ajuda para usar a ideia que o RCMRO deu. O codigo a seguir esta funcionando usando o SendMessage:

Const SC_MONITORPOWER As Integer = &HF170
Const MONITOR_ON As Integer = (-1)
Const MONITOR_OFF As Integer = 2
Const WM_SYSCOMMAND As Integer = &H112

Private Declare Function SendMessage Lib [Ô]user32[Ô] Alias [Ô]SendMessageA[Ô] (ByVal hWnd As IntPtr, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32) As Int32

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
SendMessage(Me.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF)
End Sub


Ao clicar no botão o monitor automaticamente vai hibernar.
Poderia usar esse codigo para apertar as teclas F1, F2, F3, etc....? sem ser limitado ao form?
Quais aos Constantes que devo declarar e como usalas no Button1_Click por exemplo...?

Obrigado novamente pela ajuda e desculpe a ignorancia.
MAZIN 04/09/2009 11:03:29
#321939
CALTABIANO, muito legal seu programa testei e esta funcionando perfeitamente!
Só que neste caso, vc captura o evento click do teclado. E na verdade eu quero mandar o evento click do teclado

Por Ex:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
tecla.F1.press
End Sub


Logico que é apenas um ex nao funcional, porem, neste caso, quando eu click no button1 o sistema aperta o F1 que por fim esta programado para fazer outra coisa.

Fico mais claro agora? Se nao entendeu eu tento explicar melhor...

Obrigado pela ajuda mano, aguardo respostas.
CALTABIANO 04/09/2009 11:39:33
#321946
Ja tentou utilizar a propriedade

Key.Send{F12}
CALTABIANO 04/09/2009 11:42:48
#321948
MAZIN 04/09/2009 11:53:56
#321953
Sim, ja testei.

Se ler meu primeiro comentario acima eu disse que esse exemplo é baseado em STRING e funciona até certo ponto se vc setar o foco em um txt_box mas não é o que eu quero.
Eu quero enviar um click real sem precisar de foco especifico no form.



Olhem essa API e me digam se tem alguma ideia:

Public Class Form1
[ô] estrutura necessária para chamada da API
Private Structure OSVERSIONINFO
Dim dwOSVersionInfoSize As Integer
Dim dwMajorVersion As Integer
Dim dwMinorVersion As Integer
Dim dwBuildNumber As Integer
Dim dwPlatformId As Integer
<VBFixedString(128), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=128)> Public szCSDVersion As String [ô] Maintenance string for PSS usage
End Structure

Private Declare Function GetVersionEx Lib [Ô]kernel32[Ô] Alias [Ô]GetVersionExA[Ô] (ByRef lpVersionInformation As OSVERSIONINFO) As Integer
Private Declare Sub keybd_event Lib [Ô]user32[Ô] (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
Private Declare Function GetKeyboardState Lib [Ô]user32[Ô] (ByRef pbKeyState As Byte) As Integer
Private Declare Function SetKeyboardState Lib [Ô]user32[Ô] (ByRef lppbKeyState As Byte) As Integer

[ô]Costantes necessárias
Const VK_NUMLOCK As Short = &H90S
Const VK_SCROLL As Short = &H91S
Const VK_CAPITAL As Short = &H14S
Const KEYEVENTF_EXTENDEDKEY As Short = &H1S
Const KEYEVENTF_KEYUP As Short = &H2S
Const VER_PLATFORM_WIN32_NT As Short = 2
Const VER_PLATFORM_WIN32_WINDOWS As Short = 1
Const VK_f1 As Short = 113

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim o As OSVERSIONINFO
Dim NumLockState As Boolean
o.dwOSVersionInfoSize = Len(o)
GetVersionEx(o)
Dim keys(255) As Byte
GetKeyboardState(keys(0))

[ô]NUMLOCK
NumLockState = keys(VK_NUMLOCK)
[ô]Verifica estado do NUMLOCK, se estiver desativado -> ativa-o
If NumLockState <> True Then
If o.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then [ô]=== Win95/98
keys(VK_NUMLOCK) = 1
SetKeyboardState(keys(0))
ElseIf o.dwPlatformId = VER_PLATFORM_WIN32_NT Then [ô]=== WinNT
[ô]Key Press
keybd_event(VK_NUMLOCK, &H45S, KEYEVENTF_EXTENDEDKEY Or 0, 0)
[ô]Key Release
keybd_event(VK_NUMLOCK, &H45S, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
End If
Else [ô]se estiver ativado -> desativa-o
If o.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then [ô]=== Win95/98
keys(VK_NUMLOCK) = 0
SetKeyboardState(keys(0))
ElseIf o.dwPlatformId = VER_PLATFORM_WIN32_NT Then [ô]=== WinNT
[ô]Key Press
keybd_event(VK_NUMLOCK, &H45S, KEYEVENTF_EXTENDEDKEY Or 0, 0)
[ô]Key Release
keybd_event(VK_NUMLOCK, &H45S, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
End If
End If
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim o As OSVERSIONINFO
Dim CapsLockState As Boolean
o.dwOSVersionInfoSize = Len(o)
GetVersionEx(o)
Dim keys(255) As Byte
GetKeyboardState(keys(0))

[ô]CAPSLOCK
CapsLockState = keys(VK_CAPITAL)

[ô]Verifica o estado do CAPSLOCK - se estiver desativado -> ativa-o
If CapsLockState <> True Then
If o.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then [ô]=== Win95/98
keys(VK_CAPITAL) = 1
SetKeyboardState(keys(0))
ElseIf o.dwPlatformId = VER_PLATFORM_WIN32_NT Then [ô]=== WinNT
[ô]Key Press
keybd_event(VK_CAPITAL, &H45S, KEYEVENTF_EXTENDEDKEY Or 0, 0)
[ô]Key Release
keybd_event(VK_CAPITAL, &H45S, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
End If
Else [ô]se estiver ativado -> desativa-o
If o.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then [ô]=== Win95/98
keys(VK_CAPITAL) = 0
SetKeyboardState(keys(0))
ElseIf o.dwPlatformId = VER_PLATFORM_WIN32_NT Then [ô]=== WinNT
[ô]Key Press
keybd_event(VK_CAPITAL, &H45S, KEYEVENTF_EXTENDEDKEY Or 0, 0)
[ô]Key Release
keybd_event(VK_CAPITAL, &H45S, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
End If
End If
End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim o As OSVERSIONINFO
Dim F1_test As Boolean
o.dwOSVersionInfoSize = Len(o)
GetVersionEx(o)
Dim keys(255) As Byte
GetKeyboardState(keys(0))

[ô]CAPSLOCK
F1_test = keys(VK_f1)

[ô]Verifica o estado do CAPSLOCK - se estiver desativado -> ativa-o

If o.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then [ô]=== Win95/98
keys(VK_f1) = 1
SetKeyboardState(keys(0))
ElseIf o.dwPlatformId = VER_PLATFORM_WIN32_NT Then [ô]=== WinNT
[ô]Key Press
keybd_event(VK_f1, 113, KEYEVENTF_EXTENDEDKEY Or 0, 0)
[ô]Key Release
keybd_event(VK_f1, 113, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
End If
End Sub
End Class


Ao clicar no botao1 ele desliga ou liga o numlook.
Ao Clicar no botao2 ele desliga ou liga o Capslook
Ao clicar no botao3 ele aperta o F1, porem no caso não esta funcionando.

Alguma ideia?

Obrigado
MAZIN 09/09/2009 09:05:01
#322361
Up...

Alguem ajuda ai
Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas