PROBLEMA COM KEYSTATE

JOAOMEIRA 30/06/2015 01:05:52
#448309
Olá,
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...
KURTGU 30/06/2015 08:00:52
#448312
se voce colocou dentro de um timer a logica nao e ele ficar executando esse comando ate o timer parar?
KURTGU 30/06/2015 08:04:31
#448313

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
KURTGU 30/06/2015 08:06:33
#448314
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
ASHKATCHUP 30/06/2015 09:26:54
#448323
Tenta assim:


hotkey = (GetAsyncKeyState(Keys.F1) & 0x8000)
JOAOMEIRA 30/06/2015 12:13:51
#448339
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???
ASHKATCHUP 30/06/2015 13:38:09
#448341
Citação:

Para que exatamente serve este 0x8000???



é uma gambiarra. Não pergunte, apenas use.


JOAOMEIRA 30/06/2015 19:06:24
#448363
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
JOAOMEIRA 30/06/2015 19:37:51
#448366
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 ...


ASHKATCHUP 30/06/2015 23:17:22
#448371
Ops, não me liguei que era VB.

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
DS2T 02/07/2015 02:34:36
#448402
[Ô]é uma gambiarra. Não pergunte, apenas use.[Ô]

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!
Página 1 de 4 [31 registro(s)]
Faça seu login para responder