Dvě aktivní aplikace   zodpovězená otázka

VB.NET, WinAPI

Dobrý den, potřebuji poradit. Mám aplikaci, která hýbe z myší.

Ale já potřebuju, aby byla spuštěná "nezávisle". Prostě, aby při práci třeba s prohlížečkou byla stále aktivní a reagovala na stisk kláves W,S,A,D které z tím kurzorem hýbají. Takže aby byla spuštěná (a "jakoby aktivní") nezávisle na ostatních.

Jde to?

Za odpověď předem děkuji.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Pokud není okno aplikace aktivní, tak aplikace samozřejmě běží dál. Pro to nemusíte nic zvláštního programovat. Postará se o to operační systém.

Jestli jsem Vás dobře pochopil, tak potřebuje globální odchytávání stisknutých kláves, o kterém se píše v tomto článku - http://vbnet.cz/clanek--104-globalni_odc...

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Já chci, aby byla aplikace aktivní pořád.

Když píšu do prohlížeče adresu, pořád se při stisku w,s,a,d a další, bude pohybovat myší.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Záleží na tom čemu říkáte aktivní. Pokud tím myslíte, že má aplikace focus, tak to může mít pouze jedna aplikace.

Váš požadavek můžete realizovat takto:

1) Aplikace bude globálně zachytávat stisknuté klávesy (tj. bude je zachytávat, ikdyž není aktivni) - to lze realizovat postupem v článku, na který jsem poslal odkaz v předchozím příspěvku

2) Pokud zjistíte, že byla stiknuta některá z očekávaných kláves (w,s,a,d..), tak pohnete myší.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Já bych také globálně zachytával klávesy (w,a,s,d) je to asi nejlepší řešení.

Zde je kod:

#Region "Global"
    Public Const WM_HOTKEY As Integer = &H312
    Public Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Integer
    Public Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As IntPtr, ByVal id As Integer) As Integer
    Private Const Alt As Integer = &H1
    Public Const Control As Integer = &H2
    Public Const K As Integer = &H4B
#End Region
#Region "API Functions"
    Private Const WM_KEYUP As Integer = &H101
    Private Const WM_KEYDOWN As Short = &H100S
    Private Const WM_SYSKEYDOWN As Integer = &H104
    Private Const WM_SYSKEYUP As Integer = &H105

    Public Structure KBDLLHOOKSTRUCT
        Public vkCode As Integer
        Public scanCode As Integer
        Public flags As Integer
        Public time As Integer
        Public dwExtraInfo As Integer
    End Structure

    Enum virtualKey
        K_A = &H41
        K_D = &H44
        K_S = &H53
        K_W = &H57

    End Enum

    Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Integer) As Integer
    Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Integer, ByVal lpfn As KeyboardHookDelegate, ByVal hmod As Integer, ByVal dwThreadId As Integer) As Integer
    Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey 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 Delegate Function KeyboardHookDelegate(ByVal Code As Integer, ByVal wParam As Integer, ByRef lParam As KBDLLHOOKSTRUCT) As Integer
    Private Declare Function GetForegroundWindow Lib "user32.dll" () As Int32
    Private Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" (ByVal hwnd As Int32, ByVal lpString As String, ByVal cch As Int32) As Int32
#End Region
#Region "Keylog"

    Private KeyboardHandle As IntPtr = 0
    Private LastCheckedForegroundTitle As String = ""
    Private callback As KeyboardHookDelegate = Nothing
    Private KeyLog As String

    Private Function GetActiveWindowTitle() As String
        Dim MyStr As String
        MyStr = New String(Chr(0), 100)
        GetWindowText(GetForegroundWindow, MyStr, 100)
        MyStr = MyStr.Substring(0, InStr(MyStr, Chr(0)) - 1)
        Return MyStr
    End Function

    Private Function Hooked()
        Return KeyboardHandle <> 0
    End Function

    Public Sub HookKeyboard()
        callback = New KeyboardHookDelegate(AddressOf KeyboardCallback)
        KeyboardHandle = SetWindowsHookEx(13, callback, Process.GetCurrentProcess.MainModule.BaseAddress, 0)
        If KeyboardHandle <> 0 Then
        End If
    End Sub

    Public Sub UnhookKeyboard()
        If (Hooked()) Then
            If UnhookWindowsHookEx(KeyboardHandle) <> 0 Then
                KeyboardHandle = 0
            End If
        End If
    End Sub

    Public Function KeyboardCallback(ByVal Code As Integer, ByVal wParam As Integer, ByRef lParam As KBDLLHOOKSTRUCT) As Integer
        If wParam = WM_KEYDOWN Or wParam = WM_SYSKEYDOWN Then
            Select Case lParam.vkCode
                Case virtualKey.K_A
                    'akce pri stisknuti A
                    MsgBox("a")
                Case virtualKey.K_D
                    'akce pri stisknuti D
                Case virtualKey.K_S
                    'akce pri stisknuti S
                Case virtualKey.K_W
                    'akce pri stisknuti W
            End Select
        End If
        Return CallNextHookEx(KeyboardHandle, Code, wParam, lParam)
    End Function
#End Region

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        RegisterHotKey(Me.Handle, 9, Alt Or Control, K)
        Call HookKeyboard()
    End Sub
    Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        UnregisterHotKey(Me.Handle, 9)
        Call UnhookKeyboard()
    End Sub
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

a klávesy t,g,z,h přidám jak?

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Naprosto jednoduše

Sem doplňte

    Enum virtualKey
        K_A = &H41
        K_D = &H44
        K_S = &H53
        K_W = &H57

    End Enum

tohle


K_T = &H54 ' T
K_G = &H47 ' G
K_Z = &H5A ' Z
K_H = &H48 ' H

A za tohle

Case virtualKey.K_W
'akce pri stisknuti W

dopište

Case virtualKey.K_T
'akce pri stisknuti T

a u ostatních je to stejné

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Kde získáváte ty kódy kláves (myslím třeba to &H54 = T)? :-)

Jinak jaký je kód pro ENTER (já jsem fakticky hlava děravá).

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Zde je myslím dostatečná tabulka, sice myslím že už to tu někde je, ale zde je to znovu:

        K_Return = &HD
        K_Backspace = &H8
        K_Space = &H20
        K_Tab = &H9
        K_Esc = &H1B
        K_Control = &H11
        K_LControl = &HA2
        K_RControl = &HA3
        K_Delete = &H2E
        K_End = &H23
        K_Home = &H24
        K_Insert = &H2D
        K_Shift = &H10
        K_LShift = &HA0
        K_RShift = &HA1
        K_Pause = &H13
        K_PrintScreen = 44
        K_LWin = &H5B
        K_RWin = &H5C
        K_Alt = &H12
        K_LAlt = &HA4
        K_RAlt = &HA5
        K_NumLock = &H90
        K_ScrollLock = 145
        K_CapsLock = &H14
        K_Up = &H26
        K_Down = &H28
        K_Right = &H27
        K_Left = &H25
        K_F1 = &H70
        K_F2 = &H71
        K_F3 = &H72
        K_F4 = &H73
        K_F5 = &H74
        K_F6 = &H75
        K_F7 = &H76
        K_F8 = &H77
        K_F9 = &H78
        K_F10 = &H79
        K_F11 = &H7A
        K_F12 = &H7B
        K_F13 = &H7C
        K_F14 = &H7D
        K_F15 = &H7E
        K_F16 = &H7F
        K_F17 = &H80
        K_F18 = &H81
        K_F19 = &H82
        K_F20 = &H83
        K_F21 = &H84
        K_F22 = &H85
        K_F23 = &H86
        K_F24 = &H87
        K_Numpad0 = &H60
        K_Numpad1 = &H61
        K_Numpad2 = &H62
        K_Numpad3 = &H63
        K_Numpad4 = &H64
        K_Numpad5 = &H65
        K_Numpad6 = &H66
        K_Numpad7 = &H67
        K_Numpad8 = &H68
        K_Numpad9 = &H69
        K_Num_Add = &H6B
        K_Num_Divide = &H6F
        K_Num_Multiply = &H6A
        K_Num_Subtract = &H6D
        K_Num_Decimal = &H6E
        K_0 = &H30
        K_1 = &H31
        K_2 = &H32
        K_3 = &H33
        K_4 = &H34
        K_5 = &H35
        K_6 = &H36
        K_7 = &H37
        K_8 = &H38
        K_9 = &H39
        K_A = &H41
        K_B = &H42
        K_C = &H43
        K_D = &H44
        K_E = &H45
        K_F = &H46
        K_G = &H47
        K_H = &H48
        K_I = &H49
        K_J = &H4A
        K_K = &H4B
        K_L = &H4C
        K_M = &H4D
        K_N = &H4E
        K_O = &H4F
        K_P = &H50
        K_Q = &H51
        K_R = &H52
        K_S = &H53
        K_T = &H54
        K_U = &H55
        K_V = &H56
        K_W = &H57
        K_X = &H58
        K_Y = &H59
        K_Z = &H5A
        K_Subtract = 189
        K_Decimal = 190
        K_Raute = 191
        K_Beistrich = 188
        K_Hoch = 220
        K_App = 221
        K_Ss = 219
        K_Klein = 226
        K_Menu = 93
        K_PicUp = 33
        K_PicDown = 34
        K_NumlockOn0 = 96
        K_NumlockOn1 = 97
        K_NumlockOn2 = 98
        K_NumlockOn3 = 99
        K_NumlockOn4 = 100
        K_NumlockOn5 = 101
        K_NumlockOn6 = 102
        K_NumlockOn7 = 103
        K_NumlockOn8 = 104
        K_NumlockOn9 = 105
        K_ü = 186
        K_ä = 222
        K_ö = 192
        K_Plus2 = 187
        K_DefaultMailLook = 180
        K_SetSoundLouder = 175
        K_SetSoundQuiet = 174
        K_OpenDefaultBrowser = 172
        K_Sleep = 95
        K_Calc = 183
        K_MediaPlayer = 181
        K_Play_Pause = 179
        K_Stop = 178
        K_CallExplorer = 182
        K_PlayForward = 176
        K_PlayBackward = 177
        K_EnableSound = 173

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Hýbání s myší jsem řešil v tomto topicu: http://www.vbnet.cz/forum-tema--2138-h_2...

Dělal jsem si ze svého mobilu dálkové ovládání pro PC přes wifi. Po menší modifikaci by to mohlo dělat to co potřebujete. Funguje i klikání, popř. pouze stisk myšítka (na stisk a na uvolnění tlačítka jsou samostatné funkce).

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

No ano, já to dělám podle toho jenže takhle hýbám myší, ale jak se někam přepnu tak to už nejede. Asi to vyskouším s modulem.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

S řešením, které jsem vám navrhl já, by se měl cursor hýbat i když je aplikace "hidnutá".

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ano ,hýbe se.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback