AUTO CLICK NO TECLADO
Boa tarde,
Estou usando essa API para capturar um click no teclado:
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:
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
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
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??
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.
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.
Obrigado RCMRO, vou testar e volto a postar os resultados...
Brigadão mesmo pela força
Até +
Brigadão mesmo pela força
Até +
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.
Att, Celso.
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:
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.
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.
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:
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.
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.
Ja tentou utilizar a propriedade
Key.Send{F12}
Da uma lida!!!!
http://www.developerfusion.com/article/57/sendkeys-command/
http://www.developerfusion.com/article/57/sendkeys-command/
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:
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
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
Up...
Alguem ajuda ai
Alguem ajuda ai
Tópico encerrado , respostas não são mais permitidas