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ä.
Ja mikä käyttis? Vistassa SendKeys ei toimi.
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
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!
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ä.
Heippa taas!
osin sama tarina VB versiona löytyy täältä (sivun alaosasta)
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ä. :/
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.
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
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
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?
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.
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.
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ä
Siis oletko johonkin mmorpg:iin väsäämässä bottia kun GameGuardista puhut? Ainakin vahvasti siltä vaikuttaa.
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ä.
ahaa no ei tuo vielä bannattavaa pitäisi olla :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.