PROBLEMA COM KEYSTATE
O Está ocorrendo um pequeno problema em meu programa no GetAsyncKeyState ao usa-lo em modo administrador percebi que ele está com um pequeno [Ô]bug[Ô] ou seja está detectando o botão apertado mesmo não estando... código:
Dim hotkey As Boolean
hotkey = GetAsyncKeyState(Keys.F1)
If hotkey = True Then
form2.show()
timer3.stop()
End If
Deixo isto em um timer.... Ele precisa de estar em modo administrador pois preciso que estas janelas abram mesmo que esteja minimizado, pois em alguns programas que usam fullscreen ele não detecta o botão pressionada..
O [Ô]bug[Ô] é que quando eu pressiono F1 uma vez ele acaba que fica detectando F1 pressionado até eu apertar F1 novamente...
Gostaria saber se existe outra forma de detectar uma tecla apertada em qualquer area do computador para ver se não ira dar este problema novamente ou caso saibam oque eu deva fazer para consertar isso que pudessem estar me dizendo agradeceria muito...
Private Declare Function GetKeyPress Lib [Ô]user32[Ô] Alias [Ô]GetAsyncKeyState[Ô] (ByVal key As Integer) As Integer
Dentro do timer coloque isso
If GetKeyPress(Keys.F2) Then
Me.WindowState = FormWindowState.Normal
Else
End If
Public Class Form1
Private Const WM_HOTKEY As Integer = &H312
<DllImport([Ô]User32.dll[Ô])> Public Shared Function RegisterHotKey(ByVal hwnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Integer
End Function
<DllImport([Ô]User32.dll[Ô])> Public Shared Function UnregisterHotKey(ByVal hwnd As IntPtr, ByVal id As Integer) As Integer
End Function
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
RegisterHotKey(MyBase.Handle, 100, 0, Keys.F2)
RegisterHotKey(MyBase.Handle, 101, 0, Keys.F3)
End Sub
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg = WM_HOTKEY Then
Select Case m.WParam.ToInt32
Case 100
Me.Text = [Ô]F2 Pressed[Ô]
Case 101
Me.Text = [Ô]F3 Pressed[Ô]
End Select
End If
MyBase.WndProc(m)
End Sub
Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
UnregisterHotKey(MyBase.Handle, 100)
UnregisterHotKey(MyBase.Handle, 101)
End Sub
End Class
hotkey = (GetAsyncKeyState(Keys.F1) & 0x8000)
Citação::
se voce colocou dentro de um timer a logica nao e ele ficar executando esse comando ate o timer parar?
Desculpa ae amigão, é o seguinte ele é para ser executado no google chrome é tipo um chat que eu fiz... ao apertar a tecla F1 a form abre... Dai ao fechar ela abre sosinha como se eu estivesse pressionando F1... entendeu??
falto isso no timer não coloquei ali...
If hotkey = True Then
form2.show()
timer3.stop()
End If
E no form closing da form2, eu coloquei:
form1.timer3.start()
Eu queria que ele só detectasse a tecla se a janela ativa fosse o chrome,mozilla,opera somente navegadores....
Mas primeiro tenho que resolver este problema....
Citação::
Private Declare Function GetKeyPress Lib [Ô]user32[Ô] Alias [Ô]GetAsyncKeyState[Ô] (ByVal key As Integer) As Integer
Dentro do timer coloque isso
If GetKeyPress(Keys.F2) Then
Me.WindowState = FormWindowState.Normal
Else
End If
Vou tentar para ver como fica... a noite respondo ou edito minha resposta ...
Citação::
Agora se quiser mais complexo...
Public Class Form1
Private Const WM_HOTKEY As Integer = &H312
<DllImport([Ô]User32.dll[Ô])> Public Shared Function RegisterHotKey(ByVal hwnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Integer
End Function
<DllImport([Ô]User32.dll[Ô])> Public Shared Function UnregisterHotKey(ByVal hwnd As IntPtr, ByVal id As Integer) As Integer
End Function
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
RegisterHotKey(MyBase.Handle, 100, 0, Keys.F2)
RegisterHotKey(MyBase.Handle, 101, 0, Keys.F3)
End Sub
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg = WM_HOTKEY Then
Select Case m.WParam.ToInt32
Case 100
Me.Text = [Ô]F2 Pressed[Ô]
Case 101
Me.Text = [Ô]F3 Pressed[Ô]
End Select
End If
MyBase.WndProc(m)
End Sub
Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
UnregisterHotKey(MyBase.Handle, 100)
UnregisterHotKey(MyBase.Handle, 101)
End Sub
End Class
Não entendi muita coisa... se pudesse explicar...
Citação::
Tenta assim:
hotkey = (GetAsyncKeyState(Keys.F1) & 0x8000)
Para que exatamente serve este 0x8000???
Citação:Para que exatamente serve este 0x8000???
é uma gambiarra. Não pergunte, apenas use.
Citação::
Para que exatamente serve este 0x8000???
é uma gambiarra. Não pergunte, apenas use.
Usei e olha oque aconteceu...
Imagem da linha
Imagem do erro
Citação:Private Declare Function GetKeyPress Lib [Ô]user32[Ô] Alias [Ô]GetAsyncKeyState[Ô] (ByVal key As Integer) As Integer
Dentro do timer coloque isso
If GetKeyPress(Keys.F2) Then
Me.WindowState = FormWindowState.Normal
Else
End If
Usei e continua com o mesmo problema, esse [Ô]GetKeyPress[Ô] faz a mesma coisa que o [Ô]GetAsyncKeyState[Ô] ... Só muda que usa if para ser executado....
Segue imagens de como usei ...
Mas achei uma solução melhor.
hotkey = (GetAsyncKeyState(Keys.F1) < 0)
Referencia: https://social.msdn.microsoft.com/Forums/vstudio/en-US/d9c3eee6-a41a-422b-a7c0-8d1b25d26005/what-32767-means-?forum=csharpgeneral
Hahahahahahaha essa foi boa hahahahaha
Na verdade:
hotkey = ((GetAsyncKeyState(Keys.F1) & 0x8000) != 0)
Aparentemente, poderia funcionar bem se fosse c#
Todavia, isso não tem no VB6. Essa notação [Ô]0x8000[Ô] significa um número hexadecimal. Na realidade, representa em binário esse valor: 1000 0000 0000 0000
Esse [Ô]&[Ô] faz o mesmo papel do [Ô]And[Ô] no nosso VBzinho. Não como operador lógico... mas sim como o operador de comparação bit a bit. Resumindo, esse número acaba sendo apenas um flag.
O código do amigo acima deve funcionar, se não funcionar tente usar esse:
hotkey = (GetAsyncKeyState(Keys.F1) And &H8000) = &H8000
ou esse: (Que só converti pro vb.net do AshKetchum, da cidade de Palete)
hotkey = ((GetAsyncKeyState(Keys.F1) And &H8000) <> 0)
Abração!