Je viens de regarder ton code.
Il est possible de modifier le menu système de la calculatrice mais je pense que subclasser simplement la calculatrice avec l'API SetWindowLong_ n'est pas possible car la calculatrice appartient à un autre process
Microsoft dit ceci :
Subclassing is allowed only within a process. An application cannot subclass a window or class that belongs to another process.
l'article de MS est ici
http://msdn.microsoft.com/library/defau ... bclas3.asp
Je me trompe peut-être car je ne suis pas un spécialiste
Dans cet article, il est expliqué 3 manières de faire, 2 avec des dll (la 1ere en modifiant la base de registre et la 2eme en utilisant les Hook) et la 3eme avec la modif des adresses mémoire, cette 3eme étant déconseillée par MS
Sinon, dans ton code,
Code : Tout sélectionner
OriginalWindowProc = SetWindowLong_(hWnd,#GWL_WNDPROC,@MyMenuProc())
OriginalWindowProc doit être une variable globale
False est une constante et doit commencer par # (GetSystemMenu_)
il n'est pas possible de récupérer le handle de la calculatrice avec WindowID() car aucune fenêtre n'est crée et la calculatrice est un exécutable propre
Pour récupérer le handle de la calculatrice, utilises ce code
Code : Tout sélectionner
RunProgram ("calc")
Delay(1000)
hWnd.L = GetForegroundWindow_()
Mais il apparement pas possible de subclasser la calculatrice facilement, SetWindowLong_ échoue et l'erreur correspond à acces refusé (c'est l'accès mémoire)
En regardant avec le débugger, on voit que ton code se ferme alors que la calculatrice reste bien affichée. J'ai donc fait un essai avec une variable globale pour ne pas fermer ton code avant de m'apercevoir de ça
voici le code qui modifie le menu système de la calculatrice mais sans rien intercepter, il ne fonctionne pas
Code : Tout sélectionner
#MF_STRING = $0
#MF_ENABLED = $0
#IDM_MYMENUITEM = 2003
; #WM_SYSCOMMAND = $112
#GWL_WNDPROC = -4
Global OriginalWindowproc.l, Quitter_Calculatrice
Procedure.l MymenuProc(hWnd.l , msg.l, wParam.l, lparam.l)
MyMenuProc = SetWindowLong_(hWnd.l, #GWL_WNDPROC, OriginalWindowProc)
If msg = #WM_SYSCOMMAND And WParam = #IDM_MYMENUITEM
Debug WParam
MessageRequester("","New menu item clicked",16)
ProcedureReturn 0
ElseIf msg = #WM_SYSCOMMAND And WParam = #SC_CLOSE
Quitter_Calculatrice = 1
Debug Quitter_Calculatrice
Else
ProcedureReturn MyMenuProc
EndIf
EndProcedure
Procedure AddToSystemMenu(hWND)
hSystemMenu.l = GetSystemMenu_(hwnd, #False)
AppendMenu_(hSystemMenu,#MF_STRING+#MF_ENABLED, #IDM_MYMENUITEM, "My Menu ITEM")
OriginalWindowProc = SetWindowLong_(hWnd,#GWL_WNDPROC,@MyMenuProc())
EndProcedure
OpenWindow(100, x, y, LargeurInterne, HauteurInterne, #PB_Window_Invisible, "")
; on initialise Quitter_Calculatrice
Quitter_Calculatrice = 0 ; à 0 la calculatrice tourne
; à 1 la calculatrice a été fermée; mis à 1 dans la procedure MymenuProc
RunProgram ("calc")
Delay(1000)
hWnd.L = GetForegroundWindow_() ; pour récupérer le bon Handle
AddToSystemMenu(hWnd)
; n'est pas fermée
Repeat
Until Quitter_Calculatrice = 1 ; on ne ferme pas ton prog tant que la calculatrice
End