Newsgroup: it.comp.appl.access
Titolo: Posizionare il puntatore del mouse su un controllo

E' possibile via codice posizionare il puntatore del mouse su un controllo
pulsante di comando?


NomeMaschera.NomeControllo.SetFocus 

> NomeMaschera.NomeControllo.SetFocus
Non intendevo il focus del controllo intendevo il puntatore del mouse.
Il cursore...

 pulsante di comando?
Direi che è tutto o quasi tutto possibile:
Ora il problema è ricavare le Coordinate relative del tuo controllo, che
non avendo l'Handle se non dopo aver ricevuto il focus.... è un pò
laborioso...!
La cosa più semplice è ricavare le Coordinate della Form relative alla
MDI_Access
e per somma aggiungere quelle del Controllo relative alla Form trasformate
in
TWIPS ovviamente.
Calcolate le nuove X,Y le passi alla chiamata API SetCursorPos.
Ti allego una funzione che ricava le coordinate del Controllo che non ho
provato
ma ho modificato al volo per farti capire.
Se metti il codice sotto in un Modulo e dalla Form la chiami così:
Call MousePosition(Me!NomeControllo)
Dovrebbe, a meno di errori grossolani spostare il Cursore(Funziona
sicuramente).
Se ho dimenticato qualche dichiarazione API è solo perchè ho ricostruito in
fretta il codice MINIMALE, io per semplicità le dichiarazioni API le ho
tutte
in un Modulo e non me le porto dietro sparse..., pertanto se ne ho
dimenticata cercala
nel Web...!
'------------------------- METTILA IN UN MODULO --------------------------
Declare Function SetCursorPos Lib "user32" Alias "SetCursorPos" (ByVal x As
Long, ByVal y As Long) As Long
Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As
RECT) As Long
Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex
As Long) As Long
Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hdc As
Long) As Long
Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As
Long) As Long
Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd
As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Declare Function GetDC Lib "user32" Alias "GetDC" (ByVal hwnd As Long) As
Long
' GetWindow() Constants
Private Const GW_HWNDFIRST = 0
Private Const GW_HWNDLAST = 1
Private Const GW_HWNDNEXT = 2
Private Const GW_HWNDPREV = 3
Private Const GW_OWNER = 4
Private Const GW_CHILD = 5
Private Const GW_MAX = 5
' Twips per inch
Private Const TwipsPerInch = 1440&
'  Device Parameters for GetDeviceCaps()
Private Const LOGPIXELSX = 88        '  Logical pixels/inch in X
Private Const LOGPIXELSY = 90        '  Logical pixels/inch in Y
Private Const BITSPIXEL = 12         '  Number of bits per pixel
Private Const SM_CXSCREEN = 0
Private Const SM_CYSCREEN = 1
Private Const SM_CXVSCROLL = 2
Private Const SM_CYHSCROLL = 3
Private Const SM_CXBORDER = 5
Private Const SM_CYBORDER = 6
Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
Type POINTAPI
    X As Long
    Y As Long
End Type
' Horizontal and Vertical Screen resolution
Private m_Screendpi As POINTAPI
'  Questa Funzione prende spunto da una Routines di LEBANS
'  è stata semplificata per l'uso differente dall'Originale
Public Function MousePosition(ctl As Access.Control) As POINTAPI
    ' Window handle to our Form's Detail Section
    Dim m_hWndSection As Long
    ' For positioning window
    Dim rc As RECT
    Dim lOffSet As POINTAPI
    Dim lRet As Long
    ' Since we are turning off screen redraw ignore all errors
    On Error Resume Next
    ' Get the Window handle for the form Section containing this control
    m_hWndSection = fFindSectionhWnd(ctl)
    ' Calculate the LEFT offset for this control from the edge of the
Section
    ' First calc our screen resolution
    GetScreenDPI
    ' Get window rectangle of the Section
    lRet = GetWindowRect(m_hWndSection, rc)
    ' Add to Windows Section Rectangle my ctl Deplacement
    lOffSet.X = ((ctl.Left+ctl.Width/2) / (TwipsPerInch / m_Screendpi.X)) +
rc.Left& - 1
    lOffSet.Y = ((ctl.Top + ctl.Height/2) / (TwipsPerInch / m_Screendpi.Y))
+ rc.Top - 2
    SetCursorPos  lOffSet.X,lOffSet.Y
    MousePosition = lOffSet
End Function
Private Sub GetScreenDPI()
    Dim lngDC As Long
    lngDC = GetDC(0)
    m_Screendpi.X = GetDeviceCaps(lngDC, LOGPIXELSX)
    m_Screendpi.Y = GetDeviceCaps(lngDC, LOGPIXELSY)
    lngDC = ReleaseDC(0, lngDC)
End Sub
Private Function fFindSectionhWnd(ctl As Access.Control) As Long
    ' Get ListBox's hWnd
    Dim hWnd_LSB As Long
    Dim hWnd_Temp As Long
    ' Window RECT vars
    Dim rc As RECT
    Dim pt As POINTAPI
    ' Loop Counters
    Dim SectionCounter As Long
    Dim ctr As Long
    ' Which Section contains the Control?
    Select Case ctl.Section
        Case acDetail   '0
            SectionCounter = 2
        Case acHeader   '1
            SectionCounter = 1
        Case acFooter   '2
            SectionCounter = 3
        Case Else
        '  ****   NEED ERROR HANDLING! ****
    End Select
    ' Setup SectionCounter
    ' Form Header, Detail and then Footer
    ctr = 1
    ' Let's get first Child Window of the FORM
    hWnd_LSB = GetWindow(ctl.Parent.hWnd, GW_CHILD)
    ' Let's walk through every sibling window of the Form
    Do
        If fGetClassName(hWnd_LSB) = "OFormSub" Then
        ' First OFormSub is the Form's Header. We want the next next one
        ' which is the detail section
            If ctr = SectionCounter Then
                fFindSectionhWnd = hWnd_LSB
                Exit Function
            End If
             ' Increment our Section Counter
            ctr = ctr + 1
        End If
    ' Let's get the NEXT SIBLING Window
    hWnd_LSB = GetWindow(hWnd_LSB, GW_HWNDNEXT)
    ' Let's Start the process from the Top again
    ' Really just an error check
    Loop While hWnd_LSB <> 0
    ' SORRY - NO ListBox hWnd is available
    fFindSectionhWnd = 0
End Function
' From Dev Ashish's Site
' The Access Web
' 
http://www.mvps.org/access/
Private Function fGetClassName(hWnd As Long)
Dim strBuffer As String
Dim lngLen As Long
Const MAX_LEN = 255
    strBuffer = Space$(MAX_LEN)
    lngLen = GetClassName(hWnd, strBuffer, MAX_LEN)
    If lngLen > 0 Then fGetClassName = Left$(strBuffer, lngLen)
End Function
Ciao
-- 
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.sitocomune.com/
http://www.mantuanet.it/alessandro.baraldi/
---------------------------------------------------------------------------

[CUT]
Ciao @Alex,
pensi che le funzioni ClientToScreen e ScreenToClient possano servire in 
qualche modo? Per impostare il cursore poi potrebbe bastare 
SetCursorPos...che ne pensi?
Gaspare 

[CUT]
ho trovato 1 esempio a quest'url 
http://docvb.free.fr/apidetail.php?idapi=44
 

 ha scritto nel messaggio
news:PHVse.16271$b5.7...@news3.tin.it...

Ciao Gaspare.
Beh in realtà potrebbe essere, ma ci sono sfumature che potrebbero sfuggire,
poi ricorda che SetCursorPos non accetta la Struttura dati POINTAPI, ma
solo X,Y  come Long...!
Le form possono avere più sezioni, che non vengono riconosciute, dalla
chiamata API che dicevi ottieni le Coordinate del Bordo della Form che poi
è il detentore dell'HWND, ma se hai il controllo in una sezione cominciano i
guai, non riesci più a trovarci i piedi
Questo è relativo a quanto dicevi, e sicuramente funziona se nella Form non
hai Intesazione di Maschera ed il Controllo è nel Corpo, fai una prova a
mettere un Intestazione, e vedrai che il posizionamento sbaglia
proprio dell'altezza dell'intestazione.....!
Per non diventare matto a leggere dell'esistenza di troppe variabili la
funzione che
ho passato legge direttamente l'Hwnd della Sezione e ricava quelle
coordinate
fregandosi di tutto il resto.
Dim P as POINTAPI
Dim ret As Long
ret = ClientToScreen&(Form1.hwnd, P)
P.x = P.x + fConvTwips(Ctl.Left+(ctl.Width / 2),0)
P.y = P.y + fConvTwips(ctl.Top+(Ctl.Height / 2),1)
ret = SetCursorPos&(P.x, P.y)
Altro problema è se la Form è Popup, ma in questo caso servirebbe
aggiungere altro codice, al fine di calcolare le Coordinate relative
alla Risoluzione Video invece che alla MDI_Access, semplice, ma
in questo caso non previsto..!


[CUT]
;-)
Buona giornata :-)
Gaspare 

 ho trovato 1 esempio a quest'url
http://docvb.free.fr/apidetail.php?idapi=44
Gaspare, questo è VBA non VB, le Form ed i Controlli non si possono
trattare come in VB, quì è tutto più complicato, ti ripeto che non hai
HWND sui controlli senza Focus, solo la Form lo conserva ed al contrario
delle Form in VB possiamo avere troppe variabili.
Una Form espone un solo HWND ma in realtà ne ha molti nascosti, dalla
CaptionBar, dalle Sezioni, ecc....!
Io solitamente preferisco scrivere 2 righe di codice in più che mi
garantiscano
una riusabilità del codice in tutte le occasioni Standard.


[CUT]
in effetti č "decisamente" piů complicato che farlo in vb...
alla prossima
Gaspare 

[CUT]
Si ti ho appena risposto @Alex...hai ragione tu -> l'abitudine spesso limita 
la "visibilità" delle cose :-)
Gaspare 


Per farne cosa.
Se vuoi eseguire il click su quel pulsante basta mettere una e commerciale 
(&) davanti una lettera del pulsante ed eseguirla con Alt + lettera, oppure 
chiamare da codice l'evento click del pulsante stesso.
Potresti anche cambiare il colore dei caratteri per attirare l'attenzione 
dell'utente, creare una immagine con un cursore ed evidenziarla al momento 
opportuno...insomma a che ti serve?
Ciao, Carlo