Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Conflit entre ON_USER_EVENT et INACTIVE 0 Mar 12 Avr 2022 - 18:25 | |
| J'ai constaté un curieux phénomène.
La commande ON_USER_EVENT n'est pas prise en compte si un INACTIVE 0 a été émis auparavant, même si un ACTIVE 0 suit après. Aucun USER_EVENT n'est réçu... | |
|
silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Conflit entre ON_USER_EVENT et INACTIVE 0 Mar 12 Avr 2022 - 19:01 | |
| J'ai testé avec la V0929i8 et la V0929i11 et ces codes: - Code:
-
label traite_event
inactive 0
On_User_Event traite_event
dll_on "C:\Program Files\FreeBASIC\Mes sources\PANORAMIC dll\MaDLL.dll" ' dll_on "MaDLL.dll" print dll_call1("USER_EVENT",handle(0)) dll_off
active 0
end
traite_event: message "événement déclenché par DLL"+chr$(13)+chr$(10)+"USER_EVENT_WPARAM="+str$(USER_EVENT_WPARAM)+chr$(13)+chr$(10)+"USER_EVENT_LPARAM="+str$(USER_EVENT_LPARAM) return
et - Code:
-
inactive 0
application_title "Test library"
label Traite_User_Event dim wparam%,lparam% dim titre_form$
' nouvelle commande utilisateur On_User_Event Traite_User_Event ' wparam% = 12 lparam% = 34 titre_form$="PANORAMIC V "+version$ SEND_EVENT_B(titre_form$, wparam%, lparam%) ' MESSAGE_SEND handle_form("PANORAMIC V "+version$),4024,wparam%, lparam% :' commande caché, sans effet
active 0
END Traite_User_Event: ' Off_User_Event :' erreur(29) ---> Plus d'accès aux variables systèmes si "Off_User_Event" ' select USER_EVENT_WPARAM case 12 message "USER_EVENT_WPARAM = "+str$(USER_EVENT_WPARAM)+chr$(13)+chr$(10)+"USER_EVENT_LPARAM = "+str$(USER_EVENT_LPARAM) end_select ' ' On_User_Event Traite_User_Event return
' SUBs ' Nouvelles commandes dlls sub SEND_EVENT_A(form_name$,value1%,value2%) dim_local hndl% if variable("event_index%")=0 dim event_index% if variable("user32%")=0 then dim user32% event_index%=4024 : user32%=2 :' event_index% doit toujours avoir la valeur 4024 ' cré la commande qui permet de déclencher un évènement LIBRARY user32%,"user32.dll" command "call_user_event","SendMessageA",user32%,"IIII","stdcall" end_if ' ' déclenche l'évènement(Attention, c'est toujours et uniquement le form 0 de l'executable en cours qui active la commande 'on_user_event'!) hndl%=handle_form(form_name$) if hndl%<>0 call_user_event hndl%,event_index%,value1%,value2% else ' ne rien faire end_if end_sub
' commande dll classique sub SEND_EVENT_B(form_name$,value1%,value2%) dim_local hndl%,ret% ' déclenche l'évènement(Attention, c'est toujours et uniquement le form 0 de l'executable en cours qui active la commande 'on_user_event'!) hndl%=handle_form(form_name$) if hndl%<>0 dll_on "user32.dll" ret%=dll_call4("SendMessageA",hndl%,4024,value1%,value2%) dll_off else ' ne rien faire end_if end_sub
et je n'ai rien constaté. | |
|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Conflit entre ON_USER_EVENT et INACTIVE 0 Mar 12 Avr 2022 - 23:47 | |
| OK. J'ai fait des tests plus approfondis. Constat: si on fait DLL_ON alors que la form 0 est inactive, alors la génération d'un USER_EVENT n'a jamais lieu. Vérification faite: le fait de faire INACTIVE 0 fause la détection du handle de la form 0 ! Or, lors du chargement de la DLL, je détermine, une fois pour toutes, le handle de la form 0. Donc, si la form 0 est inactive lors de DLL_ON, ma variable globale MAIN_FORM_HANDLE ne contient pas la bonne valeur et tout le mécanisme ensuite est faussé. Code Panoramic commenté: - Code:
-
' test_SendUserEvent.bas
label userevent dim res%, hnd1%, hnd2%, hnd3%
hnd1% = handle(0) inactive 0 : ' USER_EVENT n'est pas généré hnd2% = handle(0) dll_on "KGF.dll" : ' <========= bloque la génération du USER_EVENT si form 0 est inactive ! active 0 hnd3% = handle(0) on_user_event userevent res% = dll_call2("SendUserEvent",21,23) message "Handles de form 0: "+str$(hnd1%)+"-->"+str$(hnd2%)+"-->"+str$(hnd3%)+" MainFormHandle="+str$(res%) end
userevent: message "User_Event: "+str$(user_event_wparam)+" "+str$(user_event_lparam) return Code de la fonction SendUserEvent: - Code:
-
const CM_PANORAMIC_USER = WM_USER + 3000;
function SendUserEvent(wp,lp: integer): integer; stdcall; export; begin SendMessage(MainFormHandle,CM_PANORAMIC_USER,wp,lp); result := MainFormHandle; end; exports SendUserEvent; Conclusion:S'il faut charger KGF.dll, il ne faut surtout pas désactiver la form 0 ! EDITCe problème peut être évité en insérant cette ligne dans le code Panoramic immédiatement après DLL_ON: - Code:
-
res% = dll_call1("SetMainFormHandle",handle(0)) | |
|
Contenu sponsorisé
| Sujet: Re: Conflit entre ON_USER_EVENT et INACTIVE 0 | |
| |
|