Newsgroup: it.comp.lang.visual-basic
Titolo: Aggiungere una voce al menu di un programma

Il problema e' come cavolo si inserisce una nuova voce in un menu??
Non ho presente alcun ocx che riesca ad aggiundere voci di menu ad un
qualsiasi altro programma generico. Per quanto ne so io lo puoi fare
solo con programmi che supportano Plug-ins (Netscape, lo stesso
compilatore vb) o comunque programmi "predisposti" come ad esempio
explorer. In questo caso comunque e' necessario definire delle
funzioni di callback quindi puoi lasciare perdere il VB (almeno la
versione 4, il 5 non mi e' ancora arrivato). In ogni caso la vedo dura
ma se vuoi essere piu' preciso sul tipo di programma forse...
Ciao,
Massimiliano Gaudenzi

 oprogramma, ma non e' impossibile.


 
enr...@spin.it
Buona la seconda. per la prima ci sono gia' passato 8)

Il problema e' come cavolo si inserisce una nuova voce in un menu??
Dovrebbe esserci la funzione API AppendMenu (e altre simili per
ricercare l'handle eccetera). Il problema e' che per implementare i
callback dovresti
1. con vb <= 4 fare un giro incredibile per simularli
2. con vb 5 passi l'indirizzo della funzione e basta.
Ciao
Stefano - 53.6%
gl...@eponet.it
http://www.geocities.com/SiliconValley/Lakes/1218
(programmazione VB 32 bit)

1. con vb <= 4 fare un giro incredibile per simularli
Ok, adesso sono curioso. Spulciando MSDN mi e' parso di capire che
potrei leggere i messaggi di un'altro thread con la funzione
SetWindowsHookEx. Il problema e' che questa vuole una funzione di
callback. In vb5 non dovrebbe essere complicato ma io ho il vb4 che
significa niente callback. Potresti spiegarmi, anche a grandi linee,
il "giro incredibile" ? Adesso che mi hai messo la pulce
nell'orecchio...
Ciao e a presto,
Massimiliano Gaudenzi

 nell'orecchio...
 
Siccome iteressa anche am, spulciando anch'io in MSDN ho trovato una
funzione sccritta in C++ che spia gli hook di una finestra.
E ho trovato anche nell'help di VB una descrizione di 2 programmi tra i
samples che facevando vedere come funzionava il callback.
Ovviamente non esistono nella mia dir samples....
Comunque come dicevo in altri messaggi, ho un controllo che fa il callback.
Della Desaware.

Della Desaware.
In C++ e' abbastanza semplice fare una funzione di callback (quindi lo
sara' ancor di piu' in VB5) ma io mi riferivo al VB4. Gli unici
articoli che ho trovato a riguardo su MSDN (quello fornito con VB4)
consigliano di fare  una dll in C++. Questo lo volevo evitare.
Ho anche trovato dei riferimenti ad un controllo della Desaware, lo
SpyWorks (e' quello che hai tu vero?); questa sera lo cerco sulla rete
e ti faccio risapere. Comunque preferirei non usare controlli di terze
parti, vorrei invece informazioni sul famoso "giro incredibile" a cui
si riferiva Roberto. In realta' una mezza idea l'avrei. Sfruttare le
funzioni di callback intrinseche a tutti i programmi per windows. Si
tratta di individuare l'indirizzo della funzione MessageProc di una
finestra della applicazione VB. Se non sbaglio, questa funzione viene
invocata quando si riceve il messaggio WM_COMMAND. Ottenuto questo
indirizzo (con GetWindowsLong), lo si passa alla SetWindowsHook per
dirottare i messaggi relativi ai menu della finestra da modificare
verso la propria finestra (senza pero' cancellari dalla coda di
origine). A questo punto, basta definire sulla propria finestra un
menu, con lo stesso indice di quello aggiunto alla applicazione
esterna, per poter scrivere il codice da eseguire direttamente nella
sub menu_click del nostro form. Questo in teoria, perche' in pratica
l'unico risultato che ho ottenuto (in mezzo ai tanti GPF) e' stato
quello di bloccare i menu' della calcolatrice (ho usato questa
applicazione come prova). Mi piacerebbe risolvere questo problema
quindi se qualcuno ha qualche idea si faccia avanti. 
Ciao a tutti,
Massimiliano Gaudenzi
P:S: non mi offendo se rispondete che ho detto un sacco di str.. basta
che motiviate le risposte!

e ti faccio risapere. 
Ho scaricato l'ocx dal sito Desaware. Permette di fare i callbacks ma
non c'e nemmeno un misero hlp e ci sono tante proprieta'/eventi di cui
non ho capito il funzionamento. Cosi' com'e' non serve a molto. 
Sorry,
Massimiliano Gaudenzi

 
Io ho un minimo di documetazioe.
Se vuoi te la manda via mail

Ok, non come volevo io (cioe' senza ocx), ma a furia di provare ho
trovato il modo di intercettare i messaggi dell'altra applicazione.
Apri un nuovo progetto. Nel form metti un timer (Timer1), un command
button (Command1) ed un controllo WinHook (WinHook1). Per quest'ultimo
apri le proprieta', vai sul pannello Selected messages e aggiungi il
messaggio WM_COMMAND alla lista Selected messages. Per il resto
inserisci nel form il seguente codice:
Option Explicit
Private Const MF_STRING = &H0&
Private Const MF_ENABLED = &H0&
Private Declare Function FindWindowEx Lib "user32" Alias
"FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1
As String, ByVal lpsz2 As String) As Long
Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As
Long
Private Declare Function AppendMenu Lib "user32" Alias "AppendMenuA"
(ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long,
ByVal lpNewItem As String) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long)
As Long
Dim lngCalcHWnd As Long
Dim lngCalcHMenu As Long
Dim lngAddedMenuID As Long
Private Sub Command1_Click()
    Dim strClassName As String
 
    lngAddedMenuID = 100
 
    lngCalcHWnd = FindWindowEx(&H0, &H0, strClassName, "Calcolatrice")
    lngCalcHMenu = GetMenu(lngCalcHWnd)
    Call AppendMenu(lngCalcHMenu, MF_STRING Or MF_ENABLED,
lngAddedMenuID, "MyMenu")
    Call DrawMenuBar(lngCalcHWnd)
 
    WinHook1.HwndParam = lngCalcHWnd
    WinHook1.HookEnabled = True
 
    Timer1.Interval = 100
    Timer1.Enabled = True
End Sub
Private Sub Form_Load()
    Shell "Calc", vbNormalNoFocus
    WinHook1.HookType = 0
    WinHook1.Monitor = 2
End Sub
Private Sub Timer1_Timer()
    DoEvents
End Sub
Private Sub WinHook1_WndMessage(wnd As Long, msg As Long, wp As Long,
lp As Long, nodef As Integer)
    Dim lngMenuID As Long
 
    lngMenuID = wp And &HFFFF
 
    If lngMenuID = lngAddedMenuID Then
        Me.SetFocus
        Call MsgBox("MyMenu")
    End If
End Sub
Il programma lavora con la calcolatrice ed e' migliorabile ma, gia
cosi' funziona bene. Il Doevents nel timer l'ho dovuto inserire
perche' se no l'evento WinHook1_WndMessage mi si scatenava solo quando
il form riceveva il focus (e non quando effettivamente il menu' veniva
selezionato). Spero che sia abbastanza chiaro, se cosi' non fosse
fammelo sapere. Ciao,
Massimiliano Gaudenzi
PS. La documentazione mandamela comunque (
mas...@stud.unipg.it
) in
particolare modo il file spy40.hlp (ovviamente se ce l'hai), grazie.

 Stefano - 53.6%
P.S. perche' la percentuale?

 
Spedisco tutto quello che ho,

P.S. perche' la percentuale?
E' il mio Nerdity Quotient ! se vuoi fare anche tu il test cerca il
link alla mia HP
