Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Näppäinpainallus

Sivun loppuun

unto [26.11.2008 15:28:00]

#

Taas kerran perinteinen "miten lähetän näppäinpainalluksen" -keskustelu.

Olen tekemässä yhteen peliin pikanäppäintä, joka lähettäisi 1 napin painalluksen aina kun klikkaan hiiren vasenta nappia. Tässä on koodini:

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Private Sub Timer1_Timer()
    If GetAsyncKeyState(1) = 0 Then
        Me.Caption = "UP"
    Else
        Me.Caption = "DOWN"
        SendKeys "1", True
    End If
End Sub

Toimii esim. notepadissa mutta, jos kyseinen peli ikkuna on focused niin tulee error (jos oikein muistan niin permission denied). Koitin myös keybd_eventtiä mutta en saanut sitä toimimaan.

PS. Timer1 on 100ms.
PSS. Ideaali olisi saada koodi triggeroimaan tuplaklikkaukseen, mutta en osaa tehdä sitä.

Grez [26.11.2008 22:36:21]

#

Ja mikä käyttis? Vistassa SendKeys ei toimi.

neau33 [27.11.2008 01:26:17]

#

Moikka unto!

Microsoft Windows Vista and later. When a message is blocked by UIPI the last error, retrieved with GetLastError, is set to 5 (access denied).

Imports System
Imports System.Diagnostics
Imports Microsoft.VisualBasic.Devices

'...

Private Sub Form1_MouseDown(sender As Object, _
e As System.Windows.Forms.MouseEventArgs) _
Handles MyBase.MouseDown

   Dim prosessi, Prosessit() As Process
   Prosessit = Process.GetProcesses()
   Dim exists As Boolean = False

   For Each prosessi in Prosessit
      With prosessi
         If LCase(.ToString).indexOf("notepad") > -1 Then
            AppActivate(.Id)
            exists = True: Exit For
         End If
      End With
   Next

   prosessi = Nothing: Prosessit = Nothing

   If MouseButtons.Right And exists Then
      My.Computer.Keyboard.SendKeys("1")
   End If

End Sub

unto [27.11.2008 16:15:08]

#

Käyttöjärjestelmänä toimii XP uusimilla patcheilla.

Mikäs toi Nean koodi on? Osaan kyllä notepadiin suoltaa teksti kuten aiemmin kerroin ja näppäimen tunnistaminen pitää toimia vaikka se ei osuisi formiin (tämäkin toimii mainitussani koodissa).

Eli siis ongelmana on tuo sendkey kohta ja tarvitsen siihen vastaavan toimivan koodin!

Grez [27.11.2008 17:09:08]

#

Mille softalle olet lähettämässä näppäimenpainalluksia?

Ohjeissa sanotaan "You can't use SendKeys to send keystrokes to an application that is not designed to run in Microsoft Windows." Eli ainakaan vanhoille dos softille ei voi lähetellä, en hämmästyisi vaikka ei toimisi kaikille Windows-softillekaan.

Nean koodi taas on vb.net -toteutus, vaikka viestistäsi tulee ihan selväksi ettet käytä vb.net:iä vaan vb:tä.

neau33 [27.11.2008 17:40:25]

#

Heippa taas!

osin sama tarina VB versiona löytyy täältä (sivun alaosasta)

unto [27.11.2008 18:13:54]

#

neau33 kirjoitti:

Heippa taas!

osin sama tarina VB versiona löytyy täältä (sivun alaosasta)

Katoin sen mutta vaikuttaa todella oudolta ratkaisulta.

Miten saisin haluamani keybd_eventillä?

Unohdin mainita, että teen peliin semmosen pienen helpotuksen, että voin grindata (lahdata monstereita) pelkällä hiirellä. On nimittäin masentavaa aina klikata objektia ja sitten ykköstä. :/

unto [27.11.2008 20:00:09]

#

Ei toi keybd_event ollutkaan sen vaikeampi, tämmönen tuli koodista:

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Private Declare Sub keybd_event Lib "user32" (ByVal bVk As _
    Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal _
    dwExtraInfo As Long)
Private Const KEYEVENTF_KEYUP = &H2

Private Sub Timer1_Timer()
    If GetAsyncKeyState(1) = 0 Then
        Me.Caption = "UP"
    Else
        Me.Caption = "DOWN"

        keybd_event &H31, 0, 0, 0
        DoEvents

        keybd_event &H31, 0, KEYEVENTF_KEYUP, 0
        DoEvents

    End If
End Sub

Ongelmana on, että toi nProtect Game Guard ilmeisesti hookkaa user32.dll:stä SendInput apin yms.

Kopioin user32.dll ja nimesin sen user35.dll ja kutsuin sitä koodissa, mutta sekään ei toiminut game guardin kanssa.

Miten voin tehdä oman .dll filun, jossa on keybd_event ja sendinput apit uudelleennimettyinä? Vois toimia sillain.

neau33 [27.11.2008 20:17:27]

#

Moikka taas unto!

jätä ne API-viritelmät väliin ja kokeile vielä kerran tätä...

'referenssi: Microsoft WMI Scripting V1.2 Library
'(C:\WINDOWS\system32\wbem\wbemdisp.TLB)

Private Sub Form1_DblClick()
    Select Case MyProgActivate
        Case True
            SendKeys "1"
    End Select
End Sub

Function MyProgActivate() As Boolean
  Dim prosessi, prosessit
  Set prosessit = GetObject _
  ("winmgmts:{impersonationLevel=impersonate}") _
  .InstancesOf("Win32_Process")
  For Each prosessi In prosessit
    With prosessi
        'notepad - tilalle peliohjelmasi nimi.exe
        If LCase(.Name) = "notepad.exe" Then
            AppActivate (.processId)
            Set prosessit = Nothing
            MyProgActivate = True
            Exit Function
        End If
    End With
  Next
  Set prosessit = Nothing
  MyProgActivate = False
End Function

Deffi [27.11.2008 20:17:44]

#

Mitenkäs aattelit tehdä omat keybd_event- ja SendInput-APIt? Jos nyt oikein muistan niin gameguard hookkaa noiden native API -vastineet SSDT:stä (jännä exportti tuolla kernelin puolella). Voit poistaa hookin jollakin olemassaolevalla antirootkit-softalla, mutta luulisin että gameguard huomaa sellasen. Voisit tehdä ajurin joka ottais NtSendUserInputin alkuperäisen osoitteen talteen ennen kuin gameguard on ladattu ja kutsuisit sitä APIa sen jälkeen ajurisi kautta. "bypass gameguard ssdt" näyttäs antavan ihan kivoja hakutuloksia googlesta.

edit. joo no ajurien koodaus ei kyllä onnistu VB:llä sitten

unto [27.11.2008 20:41:12]

#

Jep, pitää C ottaa käyttöön siinä vaiheessa.

En oo siihen koskenu pariin vuoteen, joten ei taida tulla tästä mitään. Testaan vielä tota Nean koodia.

Tarviiko tota muuttaa mitenkään?

neau33 [27.11.2008 21:07:24]

#

Moikka taas!

Toi Deffi'n väite ajurien koodaus ei kyllä onnistu VB:llä sitten ei pidä paikkaansa jos käytössä on VB6 Pro tai Enterprise versio ja tietää mitä tekee...anyway 'WMI Scripting V1.2 Library' on siitä hauska jutska, ettei tähän ole suurempaa tarvetta, kosaka laitteisto/system-käpistely onnistuu sillä paljon vaivattomammin.

unto [27.11.2008 21:24:39]

#

Luin läpi ton sun koodin nyt, eihän se tee muuta kuin ettii oikean prosessin, focusaa siihen ja käyttää SendKey:tä.

Sanoin jo ekassa viestissä, että SendKey ei toimi kun GG estää sen. Eli ei toimi toi.

neau33 [27.11.2008 22:33:36]

#

Moikka taas!

joo SendKeys juttu oli selvillä, pointtina olikin WMI...eli unohda SendKeys
tsekkaa tämä vielä läpi (oleellinen), poimi kama.Value arvoja variant muuttujaan ja tulostele johonkin...ja sit estottomasti testaat tyyliin mitäköhän tapahtuisi jos... If kama.Value = JokuArvo Then kama.Value = JokuToinenArvo...Elikäs kun sä teskkaat niitä arvoja niin olet itseasiassa lukemassa taluista, joista on osviittaa täälä

alottelijaa [27.11.2008 22:39:01]

#

Siis oletko johonkin mmorpg:iin väsäämässä bottia kun GameGuardista puhut? Ainakin vahvasti siltä vaikuttaa.

unto [27.11.2008 22:47:06]

#

alottelijaa kirjoitti:

Siis oletko johonkin mmorpg:iin väsäämässä bottia kun GameGuardista puhut? Ainakin vahvasti siltä vaikuttaa.

Jos luet viestiketjun läpi, tiedät mitä olen tekemässä.

alottelijaa [27.11.2008 22:48:47]

#

ahaa no ei tuo vielä bannattavaa pitäisi olla :)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta