Kokeilin muutamaa eri yksinkertaista vaihtoehtoa mutta mikään ei näytä toimivan.
tarvisin siis toimivan koodinpätkän jolla saan vasemman hiiren napin klikattua. yritin muun muassa tälläistä
SendKeys.Send(MouseButtons.Left)
Here you go:
'Declarations Public Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) 'consts Public Const MOUSEEVENTF_LEFTDOWN = &H2 ' left button down 'Use this mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
ja niinpoispäin.
Moi Daimeri!
mikäli kysessä on VB.NET (2002 tai uudempi) niin esim. näin...
Imports System.Drawing Imports System.Windows.Forms Imports System.Runtime.InteropServices Public Class Form1: Inherits Form Declare Auto Sub mouse_event Lib "user32" (ByVal dwFlags As Int32, ByVal dx As Int32, _ ByVal dy As Int32, ByVal cButtons As Int32, _ ByVal dwExtraInfo As IntPtr) Const MOUSEEVENTF_MOVE As Int32 = &H1 ' mouse move Const MOUSEEVENTF_LEFTDOWN As Int32 = &H2 ' left button down Const MOUSEEVENTF_LEFTUP As Int32 = &H4 ' left button up Const MOUSEEVENTF_RIGHTDOWN As Int32 = &H8 ' right button down Const MOUSEEVENTF_RIGHTUP As Int32 = &H10 ' right button up Const MOUSEEVENTF_MIDDLEDOWN As Int32 = &H20 ' middle button down Const MOUSEEVENTF_MIDDLEUP As Int32 = &H40 ' middle button up Const MOUSEEVENTF_ABSOLUTE As Int32 = &H8000 ' absolute move Const MOUSEEVENTF_WHEEL As Int32 = &H800 ' wheel button rolled Dim cur_x As Int32 Dim cur_y As Int32 Dim dest_x As Int32 Dim dest_y As Int32 Dim pt As Point Dim on_timer As Boolean Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Timer1.Interval = 3000 Timer1.Enabled = True Timer1.Start() End Sub Private Sub Button1_MouseClick(sender As Object, e As MouseEventArgs) Handles Button1.MouseClick If on_timer Then on_timer = False Timer1.Stop() MsgBox(CType(sender, Button).name.ToString & _ " -objektia on klikattu ohjelmallisesti hiiren vasemmalla") Timer1.Start() End If End Sub Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick cur_x = CType(Cursor.Position.X * 65535 / _ Screen.PrimaryScreen.Bounds.Width, Int32) cur_y = CType(Cursor.Position.Y * 65535 / _ Screen.PrimaryScreen.Bounds.Height, Int32) pt = Button1.PointToScreen(New Point( _ CType(Button1.ClientRectangle.Width / 2, Int32), _ CType(Button1.ClientRectangle.Height / 2, Int32))) dest_x = CType(pt.X * 65535 / Screen.PrimaryScreen.Bounds.Width, Int32) dest_y = CType(pt.Y * 65535 / Screen.PrimaryScreen.Bounds.Height, Int32) on_timer = True mouse_event(MOUSEEVENTF_ABSOLUTE + MOUSEEVENTF_MOVE + _ MOUSEEVENTF_LEFTDOWN + MOUSEEVENTF_LEFTUP, dest_x, dest_y, 0, IntPtr.Zero) End Sub End Class
mikäli kysesessä on VbOld (VB6 tai vanhempi) niin esim. näin...
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Private Declare Function ClientToScreen Lib "user32" ( _ ByVal hwnd As Long, lpPoint As POINTAPI) As Long Private Declare Sub mouse_event Lib "user32" ( _ ByVal dwFlags As Long, ByVal dx As Long, _ ByVal dy As Long, ByVal cButtons As Long, _ ByVal dwExtraInfo As Long) Private Const MOUSEEVENTF_MOVE = &H1 ' mouse move Private Const MOUSEEVENTF_LEFTDOWN = &H2 ' left button down Private Const MOUSEEVENTF_LEFTUP = &H4 ' left button up Private Const MOUSEEVENTF_RIGHTDOWN = &H8 ' right button down Private Const MOUSEEVENTF_RIGHTUP = &H10 ' right button up Private Const MOUSEEVENTF_MIDDLEDOWN = &H20 ' middle button down Private Const MOUSEEVENTF_MIDDLEUP = &H40 ' middle button up Private Const MOUSEEVENTF_WHEEL = &H800 ' wheel button rolled Private Const MOUSEEVENTF_ABSOLUTE = &H8000 ' absolute move Private Type POINTAPI X As Long Y As Long End Type Dim pt As POINTAPI Dim cur_x As Long Dim cur_y As Long Dim dest_x As Long Dim dest_y As Long Dim on_timer As Boolean Private Sub Form_Load() Me.ScaleMode = vbPixels Timer1.Interval = 3000 Timer1.Enabled = True End Sub Private Sub Command1_Click() If on_timer Then on_timer = False Timer1.Enabled = False MsgBox Screen.ActiveControl.Name & " -objektia on klikattu ohjelmallisesti hiiren vasemmalla" Timer1.Enabled = True End If End Sub Private Sub Timer1_Timer() GetCursorPos pt cur_x = pt.X * 65535 / ScaleX(Screen.Width, vbTwips, vbPixels) cur_y = pt.Y * 65535 / ScaleY(Screen.Height, vbTwips, vbPixels) pt.X = Command1.Width / 2 pt.Y = Command1.Height / 2 ClientToScreen Command1.hwnd, pt dest_x = pt.X * 65535 / ScaleX(Screen.Width, vbTwips, vbPixels) dest_y = pt.Y * 65535 / ScaleY(Screen.Height, vbTwips, vbPixels) on_timer = True mouse_event MOUSEEVENTF_ABSOLUTE + _ MOUSEEVENTF_MOVE + MOUSEEVENTF_LEFTDOWN + _ MOUSEEVENTF_LEFTUP, dest_x, dest_y, 0, 0 End Sub
groovyb kirjoitti:
Declarations
Public Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)'consts
Public Const MOUSEEVENTF_LEFTDOWN = &H2 ' left button down'Use this
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
Copy pastesin ton timeriin ei toiminut...
Ja -nea- Onko tosiaan niin että hiiren vasemma napin klikkaus vaatiin tommoisen määrän koodia. kun esim näppäimistön painallus vaatii vaan "sendkeys.send("a") komennon Olen siis aloittelia enkä aivan kaikkea ymmärrä niin tarvisin hieman selkeämpiä ohjeita. Kiitos kuitenkin taas kerran avusta
Ei vaadi. Nealla on tossa mäpättynä muitakin painikkeita ja kursorin positio. Pistä timerin sisään vain tuo mouse_event -kutsu, muu sälä ulkopuolelle.
Moi!
No ensinnäkään toi groovyb'n koodinpätkä ei suorita hiiren vasemman napin klikkausta vaan ainoastaan simuloi hiiren vasemman napin pohjaan painamisen siinä kohtaa näyttöä, kuin hiiren osoitin kulloinkin sattuu olemaan, muttei koskaan vapauta ko. nappia. Toisekseen groovyb'n koodinpätkän mouse_event -kutsu ei toimi VB6:ssa mikäli kutsun eteen ei laiteta Call -lausetta, koska parametrit ovat sulkeissa. Komannekseen groovyb'n Public Declare... & Public Const... jutut eivät toimi VB6:ssa jos ne esitellään lomakkeen generaalissa osiossa. Public määreet voi asettaa VB6:ssa ja vanhemmissa vain Globaalissa moduulissa.
Jos taas liikutaan VB.NET ympäristössä niin groovyb'n koodinpätkä ei toimi ensinnäkään ilman, että System.Runtime.InteropServices nimitila on importoitu luokan käyttöön, koska suoritetaan mouse_event API'n unmanaged (ohjaamatonta) koodia ja toisekseen mouse_event API'n parametrit vaativat VB.NET (.NET Framework) ympyröissä hieman erilaiset tietotyypit.
Lisäksi Windows API-esittelyissä käytetään VB.NET ympäristössa yleensä Declare Auto Sub tai Declare Auto Function julistusta mikäli ei käytetä DllImport -deklaraatiota.
Ja joo Daimeri, jos haluat ohjelmallisesti suorittaa hiiren toimintoja ja vieläpä haluamassasi kohdassa näyttöä niin koodia tarvitaan vähintäänkin sen verran, kuin olen esimerkkeihini pukannut. Mikäli akomuksesi olisi klikata jonkin toisen ohjelman lomaketta tai ohjauobjektia omasta ohjelmastasi käsin niin tarvittavan koodin määrä tulee luonnollisesti vain kasvamaan.
Esimerkkien koodit suorittavat ajastetusti 3 sekunnin välein seuraavat tehtävät:
Siirtää hiiren osoittimen näytöllä kohtaan jossa ohjelman päälomakkeella olevan komentopainikkeen keskipiste sijaitsee, riippumatta siitä millä kohtaa näyttöä em. lomake kulloinkin sijaitsee tai millä kohtaa lomaketta painike sijaitsee jos painike vain näkyy, ja suorittaa sen jälkeen ohjelmallisesti ensin hiiren vasemman napin painamisen ja sen jälkeen napin vapautuksen.
Olen laittanut VB.NET esimerkissä Button1_MouseClick tapahtumaan koodin, joka testaa, että homma todella toimii. VB6 esimerkissä olen laittanut vastaavan testikoodin Command1_Click tapahtumaan syystä ettei VB6:n komentopainikkeella ole erillistä Mouse_Click tapahtumaa.
En minä koko koodia laittanutkaan, siksi tuolla lukee "ja niin poispäin". Oletin että OP ottaa itse lopuista selvää. Ja vaikka taas herneet veditkin nenään, ei hiiren vasempaan painallukseen tarvita silti hiiren muita nappeja ja kursorin positioita, vaikka ne esimerkkiisi tungitkin. Tätähän OP kysyi: tarvitaanko koko tuo koodi. Ei tarvita. En maininnut mitään että koodisi olisi epäkelpoa tai muutenkaan huonoa. Rauhoituppa hiukan taas.
MORJENS!
groovyb kirjoitti:
En minä koko koodia... Ja vaikka taas herneet veditkin nenään, ... Rauhoituppa hiukan taas.
No herneet tuli kyllä nyt vedettyä nenään jossain muussa, kuin tässä päässä. Ja kysyjä, joka sittemmin kertoi olevansa aloittelija, saikin heti varsin tyhjentävän selityksen: "ja niinpoispäin." Kas kun ei Googlesta mitään mainittu...
jos olisit OP:n aiempia posteja lukenut, olisit huomannut ettei tämä ole ensimmäinen winapia ja vb:tä koskeva kysymys. Tästä kyseisestä syystä oletin, että asia on jo jotenkin hallussa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.