Plaats nieuw bericht   Plaats Reactie
Vorige onderwerp Printervriendelijke versie Log in om je privé berichten te bekijken Volgende onderwerp
Auteur Bericht
gerben123Offline
Onderwerp: Programma's besturen  BerichtGeplaatst: 09 mrt 2010 - 16:13
In de startblokken


Geregistreerd op: 24-mei-2009
Berichten: 11

Status: Offline
Hallo,

Is het mogelijk om andere programma's te besturen?
Bijvoorbeeld iets aan laten klikken
 
 Bekijk gebruikers profiel Stuur privé bericht  
Reageer met quote Naar boven
VozzieOffline
Onderwerp: Re: Programma's besturen  BerichtGeplaatst: 09 mrt 2010 - 18:42
Moderator


Geregistreerd op: 11-mei-2009
Berichten: 937

Status: Offline
Hallo,

Ja dit kan,... Een paar van de functies die je nodig hebt zijn FindWindow, EnumWindows, EnumChildWindows, SendMessage, PostMessage, keybd_event,...

Met FindWindow, FindWindowEx, EnumWindows, EnumChildWindows kan je windows en controls achterhalen.

Door SendMessage/PostMEssage kan je events genereren(om het in vb.net termen te zeggen).

Er zijn nog een paar functies maar dit zijn alvast de belangrijkste...

Je kan ook code injecteren in een process en in een ander process laten "draaien". Bijvoorbeeld events in een remote process opvangen en doorsturen naar jouw toepassing.

Je kan debug tools gebruiken zoals OllyDbg of zelfs visual studio. Een handige tool om windows(ramen) te analyseren en messages(events) te bekijken in een toepassing is Spy++. Deze kan je vinden onder visual studio tools.

Update: even vergeten, als je het programma zelf schreef kan je dit wel voorzien. (IPC inter process communication) Of als het ander programma een .Net programma is kan je redelijk eenvoudig eventueel stukken code aanroepen.

Groeten

_________________
con\con

Stappen, keuzes en herhaling combineren is programmeren.
 
 Bekijk gebruikers profiel Stuur privé bericht Bekijk de homepage  
Reageer met quote Naar boven
gerben123Offline
Onderwerp: Re: Programma's besturen  BerichtGeplaatst: 12 mrt 2010 - 19:52
In de startblokken


Geregistreerd op: 24-mei-2009
Berichten: 11

Status: Offline
Hallo,

Ik heb het programma niet zelf geschreven. En ik heb nu een log van het andere programma. Kun je me uitleggen hoe ik dat moet gebruiken in mijn programma?

Alvast bedankt
Very Happy
 
 Bekijk gebruikers profiel Stuur privé bericht  
Reageer met quote Naar boven
VozzieOffline
Onderwerp: Re: Programma's besturen  BerichtGeplaatst: 12 mrt 2010 - 20:34
Moderator


Geregistreerd op: 11-mei-2009
Berichten: 937

Status: Offline
Hallo,

Wat heb je in een log staan?

Er is nog vraag naar uitleg over dit topic, ik zal dan eens een tutorial schrijven maar er is genoeg te vinden op het net hierover.

Je kan een voorbeeld programma vinden van me hier op dit forum gepost. "PassWindow.zip". Het dient om een raam voorbij te gaan,... Je kan daar al heel veel info uit halen.

Update 1: post met PassWindow.zip

Update 2: deze search kan ook al helpen


Groeten

_________________
con\con

Stappen, keuzes en herhaling combineren is programmeren.
 
 Bekijk gebruikers profiel Stuur privé bericht Bekijk de homepage  
Reageer met quote Naar boven
gerben123Offline
Onderwerp: Re: Programma's besturen  BerichtGeplaatst: 13 mrt 2010 - 11:51
In de startblokken


Geregistreerd op: 24-mei-2009
Berichten: 11

Status: Offline
Ik word niets wijzer uit de log en de PassWindow werkt niet voor het programma dat ik wil besturen.

update:
Het programma AnalyseWindow werkt wel alleen krijg ik geen functies te zien.
Bij andere programma's wel.
Question
 
 Bekijk gebruikers profiel Stuur privé bericht  
Reageer met quote Naar boven
VozzieOffline
Onderwerp: Re: Programma  BerichtGeplaatst: 14 mrt 2010 - 03:38
Moderator


Geregistreerd op: 11-mei-2009
Berichten: 937

Status: Offline
Hallo,

Code voor tutorial

Even een voorbeeld, we gaan in de internet explorer settings de cookies clearen op deze manier.
(Er zijn andere manieren om cookies te verwijderen maar dit leek me een eenvoudig voorbeeld.)

Deze tutorial werkt waarschijnlijk enkel voor een Windows XP engels. De code zal dus niet overal werken. GetClassName, control index etc kunnen helpen om de code misschien op anderstalige computers te laten werken. De gebruikte methode werkt op verschillende versies van windows met verschillende programmas... mits aanpassing

Het process met settings raam kan je zo starten.
Visual Basic code:
Dim process As New Diagnostics.Process
process.StartInfo.UseShellExecute = False
process.StartInfo.FileName = "rundll32.exe"
process.StartInfo.Arguments = "shell32.dll,Control_RunDLL inetcpl.cpl,,0"
process.Start()
process.WaitForInputIdle()

MsgBox(process.MainWindowHandle = IntPtr.Zero)

process.WaitForExit()


De msgbox toont True. Dus er is geen "MainWindowHandle". Die is IntPtr.Zero(NULL).

Het internet settings raam gaat open.

shot_01

Wat je kan zien in shot_01 is dat de titel "Internet Properties" is, en de tekst op de knop "Delete".

shot_02


In shot_02 kan je zien dat Spy++ de ClassName en Tekst verklapt van de "Delete" knop.

shot_03


In shot_03 zie je dat de button een child is van de tabpage en de tabpage van de window. Dit gaan we gebruiken bij FindWindowEx omdat deze teksten uniek zijn in het raam.

Dus nu gaan we gebruik maken van FindWindow en FindWindowEx om het raam en de knop te vinden.
En de functie SendMessage om een klik op de knop de simuleren.

Visual Basic code:
Option Explicit On
Option Strict On

' deze imports is nodig voor het "DllImport" attribute en toegang tot de "Marshal" class
Imports System.Runtime.InteropServices

Class EntryPoint

    Shared Sub Main()

        Const WM_LBUTTONUP As Integer = &H202
        Const WM_LBUTTONDOWN As Integer = &H201

        Dim process As New Diagnostics.Process
        process.StartInfo.UseShellExecute = False
        process.StartInfo.FileName = "rundll32.exe"
        process.StartInfo.Arguments = "shell32.dll,Control_RunDLL inetcpl.cpl,,0"
        process.Start()
        process.WaitForInputIdle()

        'MsgBox(process.MainWindowHandle = IntPtr.Zero)

        Dim hWndProperties As IntPtr
        hWndProperties = User32.FindWindow(vbNullString, "Internet Properties")
        If (hWndProperties = IntPtr.Zero) Then
            MsgBox("Properties window niet gevonden.")
            Return
        End If

        Dim hWndTabGeneral As IntPtr
        hWndTabGeneral = User32.FindWindowEx(hWndProperties, IntPtr.Zero, vbNullString, "General")
        If (hWndTabGeneral = IntPtr.Zero) Then
            MsgBox("Tab control niet gevonden.")
            Return
        End If

        Dim hWndDeleteButton As IntPtr
        hWndDeleteButton = User32.FindWindowEx(hWndTabGeneral, IntPtr.Zero, vbNullString, "&Delete...")
        If (hWndDeleteButton = IntPtr.Zero) Then
            MsgBox("Delete button niet gevonden.")
            Return
        End If

        User32.SendMessage(hWndDeleteButton, WM_LBUTTONDOWN, 0, 0)
        User32.SendMessage(hWndDeleteButton, WM_LBUTTONUP, 0, 0)

        process.WaitForExit()

    End Sub

End Class


Class User32

    ' in deze class worden de import declaraties voor User32.dll geschreven
    ' dus is het makkelijk gebruik te maken van een name

    Public Const NAME As String = "User32.dll"

    ' in de msdn staat dat GetLastError de fout terug geeft als de funcie NULL terug geeft
    <DllImport(NAME, SetLastError:=True)> _
    Public Shared Function FindWindow( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String _
        ) As IntPtr
    End Function

    ' in de msdn staat dat GetLastError de fout terug geeft als de funcie NULL terug geeft
    <DllImport(NAME, SetLastError:=True)> _
    Public Shared Function FindWindowEx( _
        ByVal hwndParent As IntPtr, _
        ByVal hwndChildAfter As IntPtr, _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String _
        ) As IntPtr
    End Function

    ' in de msdn staat dat GetLastError de fout terug geeft als de funcie NULL terug geeft
    <DllImport(NAME, SetLastError:=True)> _
    Public Shared Function SendMessage( _
        ByVal hWnd As IntPtr, _
        ByVal uMsg As UInteger, _
        ByVal wParam As Integer, _
        ByVal lParam As Integer _
        ) As IntPtr
    End Function

End Class


En ziezo, hier gaat het "Delete Browsing History" raam al open.

- Ik heb een beetje mijn manier van "Native Functions" te importeren. Normaal maak ik een mapje aan "Native" en voeg ik daar classes per DLL aan toe met daarin de import declaraties. In dit voorbeeld ga ik alles uitbouwen in 1 bestand(1 code file).

- Meestal kijk ik in de MSDN naar de declaratie van de functie en schrijf dan de import. Dit is de beste manier om het te leren en zo zie je ook de parameter en teruggeefwaarde omschrijving. Maar een handige website om de declaraties te vinden is pinvoke.net. Wat staat voor (Platform Invoke).

- Je kan nog steeds gebruik maken van het "Declare" statement. Maar dit statement is niet compatible met andere .Net talen.(C#, F#, Managed C++,...). Dus is het misschien beter het DllImport attribute te gebruiken.


FindWindow en FindWindowEx zijn een manier om een raam te vinden. Maar ook EnumWindows en EnumChildWindows. Nu gaan we gebruik maken van EnumChildWindows en SendMessage voor alle checkboxen uit te vinken behalve de Cookies
.

Merk de verandering op van SendMessage naar PostMessage voor het klikken op de "Delete" knop. Dit is omdat SendMessage pas terugkeert nadat de message verwerkt is. PostMessage stuurt de message en keert direct terug.
(We zouden ook een andere thread kunnen opstarten.)


Visual Basic code:
Option Explicit On
Option Strict On

' deze imports is nodig voor het "DllImport" attribute en toegang tot de "Marshal" class
Imports System.Runtime.InteropServices

Class EntryPoint

    ' dezelfde waarden als in de CheckState enumeration
    'Const BST_UNCHECKED As Integer = &H0
    'Const BST_CHECKED As Integer = &H1
    'Const BST_INDETERMINATE As Integer = &H2


    Const WM_LBUTTONUP As Integer = &H202
    Const WM_LBUTTONDOWN As Integer = &H201
    Const BM_GETCHECK As Integer = &HF0
    Const BM_SETCHECK As Integer = &HF1

    Shared Sub Main()

        Dim process As New Diagnostics.Process
        process.StartInfo.UseShellExecute = False
        process.StartInfo.FileName = "rundll32.exe"
        process.StartInfo.Arguments = "shell32.dll,Control_RunDLL inetcpl.cpl,,0"
        process.Start()
        process.WaitForInputIdle()

        Dim hWndProperties As IntPtr
        hWndProperties = User32.FindWindow(vbNullString, "Internet Properties")
        If (hWndProperties = IntPtr.Zero) Then
            MsgBox("Properties window niet gevonden.")
            Return
        End If

        Dim hWndTabGeneral As IntPtr
        hWndTabGeneral = User32.FindWindowEx(hWndProperties, IntPtr.Zero, vbNullString, "General")
        If (hWndTabGeneral = IntPtr.Zero) Then
            MsgBox("Tab control niet gevonden.")
            Return
        End If

        Dim hWndDeleteButton As IntPtr
        hWndDeleteButton = User32.FindWindowEx(hWndTabGeneral, IntPtr.Zero, vbNullString, "&Delete...")
        If (hWndDeleteButton = IntPtr.Zero) Then
            MsgBox("Delete button niet gevonden.")
            Return
        End If

        User32.PostMessage(hWndDeleteButton, WM_LBUTTONDOWN, 0, 0)
        User32.PostMessage(hWndDeleteButton, WM_LBUTTONUP, 0, 0)

        System.Threading.Thread.Sleep(500)

        Dim hWndBrowseHistory As IntPtr
        hWndBrowseHistory = User32.FindWindow(vbNullString, "Delete Browsing History")
        If (hWndBrowseHistory = IntPtr.Zero) Then
            MsgBox("Browse history raam niet gevonden.")
            Return
        End If

        User32.EnumChildWindows(hWndBrowseHistory, AddressOf EnumBrowseHistoryChilds, IntPtr.Zero)

        Dim hWndOkButton As IntPtr
        hWndOkButton = User32.FindWindowEx(hWndProperties, IntPtr.Zero, vbNullString, "OK")
        If (hWndOkButton = IntPtr.Zero) Then
            MsgBox("OK button niet gevonden.")
            Return
        End If

        User32.SendMessage(hWndOkButton, WM_LBUTTONDOWN, 0, 0)
        User32.SendMessage(hWndOkButton, WM_LBUTTONUP, 0, 0)

        process.WaitForExit()

    End Sub

    Shared Function EnumBrowseHistoryChilds(ByVal hWndChild As IntPtr, ByVal lParam As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
        Dim len As Integer = User32.GetWindowTextLength(hWndChild)
        If len > 0 Then
            Dim pString As IntPtr = Marshal.AllocHGlobal((len + 1) * 2)
            Try
                User32.GetWindowTextW(hWndChild, pString, len + 1)
                Dim windowText As String = Marshal.PtrToStringUni(pString, len)
                Select Case windowText
                    Case "P&reserve Favorites website data"
                        SetCheckBox(hWndChild, CheckState.Unchecked)
                    Case "&Temporary Internet files"
                        SetCheckBox(hWndChild, CheckState.Unchecked)
                    Case "C&ookies"
                        SetCheckBox(hWndChild, CheckState.Checked)
                    Case "&History"
                        SetCheckBox(hWndChild, CheckState.Unchecked)
                    Case "&Form data"
                        SetCheckBox(hWndChild, CheckState.Unchecked)
                    Case "&Passwords"
                        SetCheckBox(hWndChild, CheckState.Unchecked)
                    Case "&InPrivate Filtering data"
                        SetCheckBox(hWndChild, CheckState.Unchecked)
                    Case "&Delete"
                        User32.SendMessage(hWndChild, WM_LBUTTONDOWN, 0, 0)
                        User32.SendMessage(hWndChild, WM_LBUTTONUP, 0, 0)
                End Select
            Finally
                Marshal.FreeHGlobal(pString)
            End Try
        End If
        Return True
    End Function

    Shared Sub SetCheckBox(ByVal hWndCheckBox As IntPtr, ByVal state As CheckState)
        Dim currentState As CheckState
        currentState = CType(User32.SendMessage(hWndCheckBox, BM_GETCHECK, 0, 0), CheckState)
        If currentState <> state Then
            User32.SendMessage(hWndCheckBox, BM_SETCHECK, state, 0)
        End If
    End Sub

End Class

Class User32

    ' in deze class worden de import declaraties voor User32.dll geschreven
    ' dus is het makkelijk gebruik te maken van een name

    Public Const NAME As String = "User32.dll"

    <DllImport(NAME, SetLastError:=True)> _
    Public Shared Function FindWindow( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String _
        ) As IntPtr
    End Function

    <DllImport(NAME, SetLastError:=True)> _
     Public Shared Function FindWindowEx( _
         ByVal hwndParent As IntPtr, _
         ByVal hwndChildAfter As IntPtr, _
         ByVal lpClassName As String, _
         ByVal lpWindowName As String _
         ) As IntPtr
    End Function

    <DllImport(NAME, SetLastError:=True)> _
    Public Shared Function SendMessage( _
        ByVal hWnd As IntPtr, _
        ByVal uMsg As UInteger, _
        ByVal wParam As Integer, _
        ByVal lParam As Integer _
        ) As Integer
    End Function

    <DllImport(NAME, SetLastError:=True)> _
    Public Shared Function PostMessage( _
        ByVal hWnd As IntPtr, _
        ByVal uMsg As UInteger, _
        ByVal wParam As Integer, _
        ByVal lParam As Integer _
        ) As IntPtr
    End Function

    <DllImport(NAME, SetLastError:=True)> _
    Public Shared Function GetWindowTextLength( _
        ByVal hWnd As IntPtr _
        ) As Integer
    End Function

    <DllImport(NAME, SetLastError:=True)> _
    Public Shared Function GetWindowTextW( _
        ByVal hWnd As IntPtr, _
        ByVal lpBuffer As IntPtr, _
        ByVal bufferLen As Integer _
        ) As Integer
    End Function

    Public Delegate Function EnumChildDelegate(ByVal hwnd As IntPtr, ByVal lParam As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean

    <DllImport(NAME, SetLastError:=True)> _
    Public Shared Function EnumChildWindows( _
        ByVal hWndParent As IntPtr, _
        ByVal lpEnumFunc As EnumChildDelegate, _
        ByVal lParam As IntPtr _
        ) As <MarshalAs(UnmanagedType.Bool)> Boolean
    End Function

End Class


Nu voor wat je precies wilt doen zal je moeten onderzoeken welke control, welke messages je er naartoe kan sturen en hoe je alles kan doen. Heb je nog vragen, stel ze gerust,...

Ik moet je bijgeleverde zip bestand nog bekijken. Maar ik ga eerst eventjes slapen... Very Happy

Groeten

_________________
con\con

Stappen, keuzes en herhaling combineren is programmeren.


Laatst aangepast door Vozzie op 16 mrt 2010 - 17:26, in totaal 4 keer bewerkt
 
 Bekijk gebruikers profiel Stuur privé bericht Bekijk de homepage  
Reageer met quote Naar boven
VozzieOffline
Onderwerp: Re: Programma  BerichtGeplaatst: 14 mrt 2010 - 04:23
Moderator


Geregistreerd op: 11-mei-2009
Berichten: 937

Status: Offline
Extra post voor de code te kunnen posten van bovenstaande tutorial. Maximum 3 attachments...

_________________
con\con

Stappen, keuzes en herhaling combineren is programmeren.


Laatst aangepast door Vozzie op 16 mrt 2010 - 17:25, in totaal 1 keer bewerkt
 
 Bekijk gebruikers profiel Stuur privé bericht Bekijk de homepage  
Reageer met quote Naar boven
VozzieOffline
Onderwerp: Re: Programma  BerichtGeplaatst: 14 mrt 2010 - 04:41
Moderator


Geregistreerd op: 11-mei-2009
Berichten: 937

Status: Offline
Hallo gerben123,

In de zip kan ik veel en niks zien. Kan je even zeggen wat je wilt doen. Een omschrijving in de zin van
- ik wil een programma starten
- dan een teksvak invullen
- dan nog een tekstvak invullen
- en dan op een knop duwen

Misschien kan de tutorial die ik schreef al helpen.

Kan je een screenshot mee leveren van het raam?

Kan je met spy++ de structuur van het raam onderzoeken?

Groeten

_________________
con\con

Stappen, keuzes en herhaling combineren is programmeren.
 
 Bekijk gebruikers profiel Stuur privé bericht Bekijk de homepage  
Reageer met quote Naar boven
gerben123Offline
Onderwerp: Re: Programma's besturen  BerichtGeplaatst: 14 mrt 2010 - 14:06
In de startblokken


Geregistreerd op: 24-mei-2009
Berichten: 11

Status: Offline
Met Spy++ lukt het niet. Hij kan geen onderscheid maken tussen de knoppen en de form.
(Denk ik) Embarassed

In screenshot 1 staat wat er gebeurt met de tutorial form.
In screenshot 2 staat waar mijn programma op zou moeten 'klikken'
 
 Bekijk gebruikers profiel Stuur privé bericht  
Reageer met quote Naar boven
wargod97Offline
Onderwerp: Re: Programma  BerichtGeplaatst: 14 mrt 2010 - 14:07
Op dreef


Geregistreerd op: 24-jul-2009
Berichten: 185

Status: Offline
Kan je ook text uit een textbox halen?
Bijvoorbeeld IE staat open en ik wil de url lezen of een andere tekstbox is dat mogelijk?
 
 Bekijk gebruikers profiel Stuur privé bericht  
Reageer met quote Naar boven
VozzieOffline
Onderwerp: Re: Programma  BerichtGeplaatst: 14 mrt 2010 - 14:12
Moderator


Geregistreerd op: 11-mei-2009
Berichten: 937

Status: Offline
Hallo,

Die screenshots, komt dat uit een website of een programma? Indien een site, kan je eens de link geven...

Voor websites zijn er eventueel andere manieren maar windows messages zijn dan waarschijnlijk wel te complex tegenover de andere manieren.

Groeten

_________________
con\con

Stappen, keuzes en herhaling combineren is programmeren.
 
 Bekijk gebruikers profiel Stuur privé bericht Bekijk de homepage  
Reageer met quote Naar boven
VozzieOffline
Onderwerp: Re: Programma  BerichtGeplaatst: 14 mrt 2010 - 15:16
Moderator


Geregistreerd op: 11-mei-2009
Berichten: 937

Status: Offline
Hallo,

gerben123 schreef:
In screenshot 1 staat wat er gebeurt met de tutorial form.
Je hebt precies enkel het eerste blokje bekeken. Maar ik denk dat de manier toch niet volledig werkt. Dat er True staat is normaal volgens de tutorial. Ik zie op de screenshot dat je pc in het nederlands staat. Dan moet je enkel in de code de teksten aanpassen naar die in het nederlands en dan zou de code normaal horen te werken.

gerben123 schreef:
In screenshot 2 staat waar mijn programma op zou moeten 'klikken'
Ik heb nog eens die log bekeken. (als het een website is laat het weten, dan kan ik misschien andere manieren aanduiden)

Ik zie in de log ,

<00283> 004402FA P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:92 yPos:453
<00283> 004402FA S WM_IME_SETCONTEXT fSet:0 iShow:C000000F
<00284> 004402FA R WM_IME_SETCONTEXT
<00285> 004402FA S WM_IME_SETCONTEXT fSet:1 iShow:C000000F
<00286> 004402FA R WM_IME_SETCONTEXT
<00287> 004402FA S WM_NCHITTEST xPos:284 yPos:582
<00288> 004402FA R WM_NCHITTEST nHittest:HTCLIENT
<00289> 004402FA S WM_NCHITTEST xPos:284 yPos:582
<00290> 004402FA R WM_NCHITTEST nHittest:HTCLIENT
<00291> 004402FA P WM_LBUTTONUP fwKeys:0000 xPos:92 yPos:453

S = SendMessage
P = PostMessage
s = SendMessage zonder teruggeefwaarde(verboden)
R = Message return value

Als dat het klikken op de start knop is wat daar in die log staat, dan kan je zien dat er een PostMessage WM_LBUTTONDOWN en een PostMessage WM_LBUTTONUP was.

gerben123 schreef:
Met Spy++ lukt het niet. Hij kan geen onderscheid maken tussen de knoppen en de form. (Denk ik) Embarassed
Wat je daar denkt klopt in volgend scenario. Stel nu dat de applicatie een "Skin" heeft en afhankelijk van de "Locatie" bepaalt waarop geklikt was, dan zouden we de klik kunnen simuleren op die plaatsen.

Als je de beschrijving bekijkt, samen met de log,... zou deze code(c++) kunnen werken.

Code:
HWND hWnd = FindWindow(NULL, L"TheApp");
if(hWnd){
  PostMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(92,453));
  PostMessage(hWnd, WM_LBUTTONUP, 0, MAKELPARAM(92,453));
}


Je kan eens zoeken op google naar "Const MK_LBUTTON" en "MakeDWord WM_LBUTTONDOWN" om deze te vertalen naar VB.Net. Je kan ook de WM_NCHITTEST messages sturen enzo,.. dus het is wel mogelijk. Maar als het niet met "standard windows controls" is dan is het soms wel een stuk moeilijker.

Update: De defenities van de windows messages kan je bekijken op de MSDN en de waarden om ze te declareren in VB.Net kan je vinden in WinUser.h. (c/c++)
Zie: http://www.google.be/search?hl=nl&q ... l=&oq=


Groeten

_________________
con\con

Stappen, keuzes en herhaling combineren is programmeren.
 
 Bekijk gebruikers profiel Stuur privé bericht Bekijk de homepage  
Reageer met quote Naar boven
gerben123Offline
Onderwerp: Re: Programma's besturen  BerichtGeplaatst: 15 mrt 2010 - 19:24
In de startblokken


Geregistreerd op: 24-mei-2009
Berichten: 11

Status: Offline
Het is geen website, maar een programma. Ik heb wat zitten zoeken op google en heb nu deze code:
Visual Basic code:
Windows.Forms.Cursor.Position = New System.Drawing.Point(269, 555)

Daarmee gaat de cursor naar de plaats van de knop alleen klikt hij nog niet.
 
 Bekijk gebruikers profiel Stuur privé bericht  
Reageer met quote Naar boven
VozzieOffline
Onderwerp: Re: Programma  BerichtGeplaatst: 16 mrt 2010 - 03:22
Moderator


Geregistreerd op: 11-mei-2009
Berichten: 937

Status: Offline
Hallo,

Je kan beter proberen te begrijpen wat ik hierboven al schreef, dan zal je misschien een manier kunnen bedenken. (het stukje code uit mijn vorige post vertalen ware al een begin)

Ik weet niet of het zal lukken door de cursor te plaatsen met .Net code maar je kan het proberen. Je zou dan kunnen de mouse_event functie gebruiken.

Hiervoor zie
- http://www.pinvoke.net/default.aspx/use ... tml?diff=y
- http://msdn.microsoft.com/en-us/library ... S.85).aspx

Maar de keybd_event en mouse_event functies kunnen ook input sturen naar een verkeerd raam/programma. (Gebruik oa SetForegroundWindow om het raam naar de voorgrond te brengen)


DUS om te leren programma's sturen op een betere manier....

1) Je moet EERST! een handle van het raam bekomen. Dit kan ofwel door FindWindow, of misschien door Process.Getprocesses() en dan process.MainWindowHandle. Ik zou voor FindWindow gaan.

2) Dan kan je beginnen met messages(Events zoals click) te sturen naar het raam. Dit door PostMessage en SendMessage.

Dus

Visual Basic code:
Dim hWnd As IntPtr
hWnd = FindWindow(vbNullString, "Rockstar Games Social Club")
If hWnd = IntPtr.Zero Then
   MsgBox( "Raam niet gevonden, probeer met andere classname of windowtext, gebruik misschien spy++")
Else
   MsgBox( "Yes! Raam gevonden, we kunnen beginnen met messages te sturen, misschien door spy++ achterhalen welke, trail and loads of errors,....!")
   SendMessage(hWnd, WM_??????, ??????, ?????)
End If


besluit: Als je programma's wil besturen, leer dan werken met de genoemde functies.

Groeten

_________________
con\con

Stappen, keuzes en herhaling combineren is programmeren.
 
 Bekijk gebruikers profiel Stuur privé bericht Bekijk de homepage  
Reageer met quote Naar boven
gerben123Offline
Onderwerp: Re: Programma's besturen  BerichtGeplaatst: 16 mrt 2010 - 15:24
In de startblokken


Geregistreerd op: 24-mei-2009
Berichten: 11

Status: Offline
Ok ik heb de code geprobeerd alleen krijg ik errors.
Zou iemand deze kunnen verbeteren?
Alvast bedankt.
Visual Basic code:
        Dim hWnd As IntPtr
        hWnd = FindWindow(vbNullString, "Rockstar Games Social Club")
        If hWnd = IntPtr.Zero Then
            MsgBox("Raam niet gevonden, probeer met andere classname of windowtext, gebruik misschien spy++")
        Else
            MsgBox("Yes! Raam gevonden, we kunnen beginnen met messages te sturen, misschien door spy++ achterhalen welke, trail and loads of errors,....!")
            SendMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(92, 453))
            SendMessage(hWnd, WM_LBUTTONUP, 0, MAKELPARAM(92, 453))
        End If
 
 Bekijk gebruikers profiel Stuur privé bericht  
Reageer met quote Naar boven
Berichten van afgelopen:     
Ga naar:  
Tijden zijn in GMT + 1 uur
Plaats nieuw bericht   Plaats Reactie
Vorige onderwerp Printervriendelijke versie Log in om je privé berichten te bekijken Volgende onderwerp
PNphpBB2 © 2003-2007