Intercettare stato pulsante Riduci a Icona tramite API

di il
16 risposte

16 Risposte - Pagina 2

  • Re: Intercettare stato pulsante Riduci a Icona tramite API

    Più che a tentativi ad esperimenti
    sicuramente non so esattamente a che risultato mi porteranno questi tentativi ma credo che imparare cose nuove serva sempre.
    rispondendo alla tua domanda sulla function SetwindowLongPtrA si gli alias sono giusti, qui sotto ti metto tutto il codice
    SUBCLASS nel modulo
    Option Compare Database
    Option Explicit
    'WIN 64
    Public Declare PtrSafe Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As LongPtr, ByVal hwnd As LongPtr, _
    ByVal msg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
    
    Public Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, _
    ByVal dwNewLong As LongPtr) As LongPtr
    
    Public Const WM_SYSCOMMAND = &H112
    Public Const SC_MINIMIZE = &HF020&
    Public Const SC_MAXIMIZE = &HF030&
    Public Const SC_RESTORE = &HF120&
    
    Public Const GWL_WNDPROC    As Long = (-4)
    Public OldWinProc           As LongPtr
    Public Function NewWndProc(ByVal hwnd As LongPtr, ByVal msg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
    
    Dim mret    As Boolean
    Dim retVal  As LongPtr
    
    Select Case uMsg
        Case WM_SYSCOMMAND
            mret = Forms!AbilitaMessaggi.GetMessage(msg, wParam)
            If mret Then Exit Function
            retVal = CallWindowProc(OldWinProc, hwnd, msg, wParam, lParam)
        Case Else
            retVal = CallWindowProc(OldWinProc, hwnd, msg, wParam, lParam)
    End Select
    NewWndProc = retVal
    End Function
    
    CODICE nella MASCHERA AbilitaMessaggi
    Option Explicit
    Private Sub Form_Load()
    ' Attivazione del SubClassing sulla Form
    OldWinProc = SetWindowLongPtr(Me.hwnd, GWL_WNDPROC, AddressOf NewWndProc)
    End Sub
    
    Private Sub Form_Unload(Cancel As Integer)
    'SetWindowLongPtr Me.hwnd, GWL_WNDPROC, OldWinProc
    End Sub
    
    Public Function GetMessage(ByVal uMsg As Long, ByVal wParam As LongPtr) As Boolean
       Select Case uMsg
          Case WM_SYSCOMMAND
             Select Case wParam
                Case SC_MINIMIZE
                   Me.lstMessage.AddItem "Ricevuto SC_MINIMIZE = " & SC_MINIMIZE & IIf(ck_SC_MINIMIZE, " Attivo", " Disattivato")
                   GetMessage = Not ck_SC_MINIMIZE
                Case SC_MAXIMIZE
                   Me.lstMessage.AddItem "Ricevuto SC_MAXIMIZE = " & SC_MAXIMIZE & IIf(ck_SC_MAXIMIZE, " Attivo", " Disattivato")
                   GetMessage = Not ck_SC_MAXIMIZE
                Case SC_RESTORE
                   Me.lstMessage.AddItem "Ricevuto SC_RESTORE = " & SC_RESTORE & IIf(ck_SC_RESTORE, " Attivo", " Disattivato")
                   GetMessage = Not ck_SC_RESTORE
                Case Else
                   GetMessage = False
                End Select
       End Select
    
    End Function
    
    Appena clicco sulla maschera va in Crash

    ho anche visto in giro che la costante GWL_WNDPROC dovrebbe essere GWLP_WNDPROC in 64 bit ma il risultato è lo stesso
    Crash
  • Re: Intercettare stato pulsante Riduci a Icona tramite API

    Secondo te che differenza passa da dichiarare
    
    Public Const GWL_WNDPROC    As Long = (-4)
    e
    
    Public Const GWLP_WNDPROC As Long = (-4)
    Se pensi che la differenza sostanziale sia nel NOME assegnato..., vale la medesima considerazione dell'ALIAS, e francamente fatico ad immaginare tu possa procedere in modo autonomo, il tema richiede decisamente una marcia in più.

    Magari dichiarandola così
    
    Public Const GWL_WNDPROC = (-4)
    La vedi la differenza tra questa e quello che hai scritto tu...? Ne cogli la sostanziale variante tecnica che rende questa FUNZIONANTE non avendo diversificato la definizione del VarType da Long a LongPtr...?

    Nel WEB ci sono molti esempi di HOOK però...
    https://www.mrexcel.com/board/threads/minimize-workbook-to-sys-tray-64bit.841979/

    Il Fatto poi che vada in CRASH se metti DEBUG o altro o visualizzi l'IDE è uno dei problemi per cui il SubClassing in VBA è poco gestibile.
    Quando attivi un HOOK, poi devi chiudere tutto e riaprire il progetto senza far partire il codice, senza passare prima per l'IDE altrimenti a prescindere il codice sia corretto va in CRASH... e così via...
    Per questo se trovi un Activex o una DLL esterna a cui delegare la gestione degli HOOK è decisamente meglio.
Devi accedere o registrarti per scrivere nel forum
16 risposte