Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    0

    [VB6] Azione click dx del mouse

    Salve a tutti, in questi giorni ho risolto un problema in VB6 per le mie capacità non da poco, sono riuscito tramite il subclassing ad intercettare il click destro del mouse su un controllo pdf.

    il codice dell'intercettazione (nel modulo) è questo:


    codice:
    Public Function nuovoProcesso(ByVal hwnd As Long, ByVal iMsg As Long,
    ByVal wParam As Long, ByVal lParam As Long) As Long
    
     If iMsg = 528 Then 'click del mouse (dx e sx)
      If wParam = 516 Then 'click del dx
       MsgBox "cliccato il destro, non si fa!!!!"
      End If
     End If
     nuovoProcesso = CallWindowProc(processoOriginale, hwnd, iMsg,wParam, lParam)
    
    End Function

    Però in questo modo quando si clicca con il dx sul controllo viene
    visualizzato un msgbox e dopo averlo chiuso appare il menu tasto destro;
    invece vorrei che il menu non venga aperto.

    Da ignorante ho pensato: intercetto il click che però viene ugualmente
    processato dalla window procedure originale.

    Come posso fare per evitare che il messaggio venga processato dalla
    window procedure originale? devo sostituire la window procedure origniale con una nuova? come faccio??

    Grazie mille

  2. #2
    Ciao.
    Potrei dire una "belinata" per il tuo caso, ma prova a mettere:

    codice:
    Exit Function
    dopo il tuo messaggio "cliccato ecc..".

    Fammi sapere.

    Giulio C. - Roma

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    0
    ci ho gia provato ma è come se non ci fosse, funziona tutto come prima anche con exit function, infatti non capisco il perchè!!!

  4. #4
    Ciao di nuovo.

    Io proverei a fare così, ammesso che tu non l'abbia già fatto:

    codice:
    Public Function nuovoProcesso(ByVal hwnd As Long, ByVal iMsg As Long,
    ByVal wParam As Long, ByVal lParam As Long) As Long
    
     If iMsg = 528 Then 'click del mouse (dx e sx)
      If wParam = 516 Then 'click del dx
       MsgBox "cliccato il destro, non si fa!!!!"
       exit function
      End If
    End Function
    Dovresti però vedere, dopo l'exit function, dove punta il tuo programma. Mi scuso sin d'ora per eventuali "cappellate" dette...

    Fammi sapere.

    Giulio C. - Roma

  5. #5
    Utente di HTML.it L'avatar di Mabi
    Registrato dal
    May 2002
    Messaggi
    1,245
    Originariamente inviato da amadori
    devo sostituire la window procedure origniale con una nuova? come faccio??
    Se può esserti utile, guarda la FAQ 119
    ... e non usare while wend è una sintassi deprecata

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    0
    cosa intendi con "dove punta il tuo programma"??

    se non richiamo la window procedure originale si blocca il programma...

  7. #7
    se tu dai un exit function in una win_procedure windows continuerà ad usare la procedura predefinita devi invece associargli una procedura modificata nella quale windows fa quello che tu vuoi faccia. Insomma se tu esci e basta windows continua a fare quello che stava facendo
    Vascello fantasma dei mentecatti nonchè baronetto della scara corona alcolica, piccolo spuccello di pezza dislessico e ubriaco- Colui che ha modificato l'orribile scritta - Gran Evacuatore Mentecatto - Tristo Mietitore Mentecatto chi usa uTonter danneggia anche te

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    0
    Originariamente inviato da xegallo
    se tu dai un exit function in una win_procedure windows continuerà ad usare la procedura predefinita devi invece associargli una procedura modificata nella quale windows fa quello che tu vuoi faccia. Insomma se tu esci e basta windows continua a fare quello che stava facendo
    ho provato al posto di exit function a richiamare
    codice:
    nuovoProcesso = CallWindowProc(processoOriginale, hwnd, iMsg, wParam, lParam)
    cambiandogli i parametri iMsg e wParam, ma si comporta come prima ("correzzione").

    Come faccio ad associargli un procedura modificata?

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    0
    ho pensato ad un'altro modo per ottenere lo stesso risultato, ho pensato di chiudere la finestra stapa nel caso che venga aperta, ma per chiuderla è necessario conoscere l'handle della finestra, ma come faccio ad ottenere l'handle di una finestra di stampa?

  10. #10
    Utente di HTML.it L'avatar di Jupy64
    Registrato dal
    Sep 2004
    Messaggi
    1,151

    Re: [VB6] Azione click dx del mouse

    [QUOTE]Originariamente inviato da amadori
    codice:
    Public Function nuovoProcesso(ByVal hwnd As Long, ByVal iMsg As Long,
    ByVal wParam As Long, ByVal lParam As Long) As Long
    
     If iMsg = 528 Then 'click del mouse (dx e sx)
        If wParam = 516 Then 'click del dx
           MsgBox "cliccato il destro, non si fa!!!!"
           wParam=0 
        End If  
     End If
     nuovoProcesso = CallWindowProc(processoOriginale, hwnd, iMsg,wParam, lParam)
    
    End Function
    Ciao, premesso che per risolvere il tuo problema basta mettere quella riga di codice che ho aggiunto in rosso, ti posto un piccolo esempio per fare il subclassing di un oggetto..

    da mettere in un modulo:
    codice:
    Option Explicit
    
    'Serve per cambiare l'indirizzo della funzione dei messaggi:
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, _
      ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    
    'Serve per richiamare la funzione di gestione messaggi originale
    Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
       ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    
    'Costante per indicare che vogliamo cambiare la funzione di gestione messaggi
    Private Const GWL_WNDPROC = -4
    
    'Click del mouse da intercettare
    Private Const WM_LBUTTONUP = &H202
    Private Const WM_RBUTTONUP = &H205
    
    'qui salviamo l'indirizzo della procedura originale
    Public oldWndProc As Long
    
    'handle dell'oggetto da subclassare
    Public gHW As Long
    
    Public Sub HookWin()
        oldWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)
    End Sub
    
    Public Sub UnHookWin()
       Dim temp As Long
       If oldWndProc > 0 Then 'è stato subclassato un oggetto...
          temp = SetWindowLong(gHW, GWL_WNDPROC, oldWndProc) 'riporto tutto com'era prima del subclass..
       End If
    End Sub
    
    Private Function WindowProc(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        Select Case wMsg
            Case WM_LBUTTONUP
                MsgBox "Click con il tasto sinistro"
                wMsg = 0
             Case WM_RBUTTONUP
                MsgBox "Click con il tasto destro"
                wMsg = 0
        End Select
        WindowProc = CallWindowProc(oldWndProc, hWnd, wMsg, wParam, lParam)
    End Function
    da mettere in un form con una textbox:
    codice:
    Option Explicit
    
    Private Sub Form_Load()
       oldWndProc = 0 'indica che non è stato subclassato niente..
       gHW = Text1.hWnd
       HookWin
    End Sub
    
    Private Sub Form_Unload(Cancel As Integer)
       UnHookWin
    End Sub
    Cliccando nella textbox si vedono gli effetti di questo esempio, magari sono cose che già sapevi, altrimenti spero che possa esserti di aiuto..
    Jupy

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.