Oppure

Loading
13/09/09 9:08
fusebyte
Ok,risolto settando in proprieta'caption Dw,ora va giu' e su che è una bellezza.:-)

Approfitto per postare il modulo
Option Explicit

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As Rect) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook&, ByVal lpfn&, ByVal hmod&, ByVal dwThreadId&) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook&) As Long

Private Type Rect
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Private Type CWPSTRUCT
    lParam As Long
    wParam As Long
    Message As Long
    hwnd As Long
End Type

Private Const WM_MOVE = &H3
Private Const WM_SETCURSOR = &H20
Private Const WM_NCPAINT = &H85
Private Const WM_COMMAND = &H111

Private Const SWP_FRAMECHANGED = &H20
Private Const GWL_EXSTYLE = -20

Private WHook&

Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long

Private Const SM_CXSIZE = 30    'Width of title bar
Private Const SM_CYSIZE = 31    'height of title bar

Public Sub Init()
    WHook = SetWindowsHookEx(4, AddressOf HookProc, 0, App.ThreadID)
    Call SetWindowLong(frmMain.picbtn.hwnd, GWL_EXSTYLE, &H80)
    Call SetParent(frmMain.picbtn.hwnd, GetParent(frmMain.hwnd))
End Sub

Public Sub Terminate()
    Call UnhookWindowsHookEx(WHook)
    Call SetParent(frmMain.picbtn.hwnd, frmMain.hwnd)
End Sub

Public Function HookProc&(ByVal nCode&, ByVal wParam&, Inf As CWPSTRUCT)
    Dim R As Rect
    Static LastParam&

    If Inf.hwnd = GetParent(frmMain.picbtn.hwnd) Then
        If Inf.Message = WM_COMMAND Then
            Select Case LastParam
            Case frmMain.picbtn.hwnd: Call frmMain.Command1_Click
            End Select
        ElseIf Inf.Message = WM_SETCURSOR Then
            LastParam = Inf.wParam
        End If
    ElseIf Inf.hwnd = frmMain.hwnd Then
        If Inf.Message = WM_NCPAINT Or Inf.Message = WM_MOVE Then
            Call GetWindowRect(frmMain.hwnd, R)
            Call SetWindowPos(frmMain.picbtn.hwnd, 0, R.Right - 110, _
            R.Top + 4, Str$(GetSystemMetrics(SM_CXSIZE)), Str$(GetSystemMetrics(SM_CYSIZE)), SWP_FRAMECHANGED)
        End If
    End If
End Function

Qualsiasi cosa faccio,tipo debug,run,clicco sulla X del Form o altro ,quando stoppo il progetto si chiude da solo.
Ho escluso TERMINATE ma continua a farlo.
Ma questi progetti come li fanno...mezzi e mezzi? :-))

Ciao
Ultima modifica effettuata da fusebyte 13/09/09 9:17
aaa
13/09/09 9:52
theprogrammer
I progetti vanno anche capiti ... se c'e' un hook e' ovvio che non puoi fare debug o altro. Devi chiudere regolarmente il progetto in modo che venga sempre eseguito l'unhook prima di terminare il programma.
aaa
13/09/09 10:26
fusebyte
Quello che mi preoccupa è che il mio progetto ha molti Form e non posso permettermi chiudendone uno che ne se chiudano altri,a meno che non decida io di chiudere l'applicazione.
Ho letto qualcosa su Hook e unhook (la prima volta che mi capita di averci a che fare)
sono associati alla dichiarazione SetWindowsHookEx e vorrei farne tanto a meno se potessi.

descrizione:

Creando un hook bisogna passare a SetWindowsHookEx un puntatore ad una funzione (parametro lpfn) che riceverà i messaggi filtrandoli. Come ognuno saprà per supplire alla mancanza di puntatori VB6 fornisce l'operatore AddressOf, ma esso risulterebbe utile solamente nel caso in cui si stia tentando di impostare un hook su un thread del processo corrente. Infatti come è scritto su MSDN se il thread specificato non appartiene al processo chiamante oppure è 0 (indica quindi l'intero sistema), il parametro lpfn deve riferirsi ad una funzione in una DLL esterna, ma è noto a tutti che VB6 non può esporre funzioni "alla C". Per questo motivo risulta impossibile creare un hook globale o associato al thread di un altro processo.


vista la palese difficolta' è possibile,avere un aiuto pratico,per far si che l'operazione
da svolgere sia solo "tira su Form","tira giu' Form" senza avere altri inconvenienti?

Grazie


"VB6 non può esporre funzioni "alla C". > ma è proprio sicuro,un amico mio faceva una DLL Bridge e mi permetteva di usare DLL in C su VB6.

Ultima modifica effettuata da fusebyte 13/09/09 10:37
aaa
13/09/09 11:29
fusebyte

WHook = SetWindowsHookEx(4, AddressOf HookProc, 0, App.ThreadID) 
    
Call UnhookWindowsHookEx(WHook) 


Esiste un metodo alternativo a Hook UnHook ?
Perche' se tolgo queste 2 linee il tasto sparisce.

Una volta compilato pero' funziona.
Ma siccome il progetto è lungo e di cose ce n'è da fare e di bug da sistemare ce ne sono altrettanti,non poter usare il DEBUG diviene un grande problema.

Se non ci fosse altra soluzione remmo (disattivo) le 2 stringhe fino a fine lavoro epoi le attivo.
Mi interessava sapere pero' di comandi alternatvi.
Piu' si impara meglio è.

Ciao
Ultima modifica effettuata da fusebyte 13/09/09 11:31
aaa
13/09/09 11:45
GrG
mi spiace ma per sapere risposta a questa tua ultima domanda dovrai aspettare thprogrammer...

per quanto riguarda il problema del "tirar su" e "tirar giù" il form lo hai risolto?
aaa
13/09/09 11:57
fusebyte
Si tutto aposto GRG,grazie,tranne una incompatibilita' di sistema fra il fatto di muovere un FORM e quello di poterlo minimizzare in icontray,sembra che si debba scegliere o uno o l'altro.
D'altra parte il progetto non prevedeva un su e giu' del FORM.
Cmq considera risolto anche questo:-)

Aspettiamo che dice TheProgrammer riguardo Hook ed unhook.


Ciao grazie ancora.
aaa
13/09/09 17:38
theprogrammer
A disposizione per dare chiarimenti, ma non ho capito bene il problema ...

Forse e' il caso di spiegarlo bene aprendo un nuovo thread e, magari, postando il progetto con le indicazioni di cosa non va e cosa ci si aspetta.
aaa
13/09/09 18:50
fusebyte
Allora ti spiego.
Ho scaricato lo ZIP messo da GRG ed ho modificato il Command1_Click per creare la
CollapseBar (definiamola cosi')
Il codice messo da GRG prevede anche che il Form vada in IconTray ma se mando in RUN il programma mi dice che
" errore 384 un Form non puo' essere spostato o ridimensionato se ridotto ad icona o ingrandito"
Quindi a causa della CollapseBar non posso usare la IconTray.
Io,ignorantemente ho dato la colpa a hook unhook e chiedevo se si potesse creare il tasto
Collapse senza usarli per poter usare sia la ICONTRAY che la CollapseBar.

Il codice è quello dello ZIP di GRG con questa modifica:

Public Sub Command1_Click()
Dim Command1_Click As Boolean

    'Call modTray.AddTrayIcon(Me.hwnd, Me.Icon, "TitleBar")
    'Me.WindowState = vbMinimized
    'Call modTray.ShowBalloon(Me.hwnd, strTitle, strInfo, [Information Icon])
    'Me.Hide

If Command1.Caption = "FormUP" Then
   frmMain.Height = 500
   Command1.Caption = "FormDOWN"
      Else

If Command1.Caption = "FormDOWN" Then
   frmMain.Height = 4000
   Command1.Caption = "FormUP"
  End If
End If


Come vedi tutto quello che riguarda la TRAY lo devo remmare,senno' mi da errore 384 fisso.
Ora se è hook ed unhook che creano fisicamente il tasto,a parte il Command1 che poi comanda gli eventi,allora c'è incompatibilita' fra la TRAY e HOOK.

Quindi solo chi conosce bene l'argomento sa se si puo' risolvere e se si,come farlo.

Se qualcosa non ti è ancora chiaro o hai bisogno di altri chiarimenti,basta che lo chiedi.

Ciao grazie
Ultima modifica effettuata da fusebyte 13/09/09 18:52
aaa