Pilotage d’une application externe. Exemple avec la calculatrice de Microsoft
Deux grandes méthodes.
La première consiste à simuler les touches de l’application
La deuxième consiste à envoyer des commandes connaissant le handle et Ctrl-id de la commande.
L’ inconvénient majeur de la première est de maintenir le focus de l’application externe au premier plan.
L’ inconvénient majeur de la deuxième est de connaitre les CTRL-ID de chaque commande.
Voici un exemple avec la deuxième méthode sans aucune simulation de touche.
Code : Tout sélectionner
EnableExplicit
;***************************** Modifier le chemin de la calculatrice que vous désirez utiliser ***********************************
Global NOM_EXE$="C:\WINDOWS\SYSTEM32\calc.exe"
; Global NOM_EXE$="E:\Program Files\Microsoft Calculatrice Plus\CalcPlus.exe" ;
;************************************************************************************************************************************
;{-Enumerations/DataSections
;{ Windows
Enumeration
#Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
#menu_1=1
#menu_2
#ComboBox_1
#ListView_2
#Button_3
#CheckBox_1
#TEXT_GAD1
#TEXT_GAD2
#ComboBox_7
#ComboBox_8
#Button_8
#ListIcon_9
#ListIcon_11
#Help=79
EndEnumeration
;}
Define.l Event,EventWindow,EventGadget,EventType,EventMenu
;}
Global hMainWnd.l ; handle de la fenêtre parent de la calculatrice
Global NOM_WND$="" ; le nom de la fenêtre sera trouvé automatiquement à partir du prg
Global PID_CALC.l
Global Whnd_stat.l,FLAG_MOD_hWND.l=0
Global Nom_stat.s="Statistiques"
Global tempo=100
Global TEMP10=10
Global sbuffer.s=Space(256)
Declare PAUSE(tmp.l)
Define mhFoundWnd.l
; Define sBuffer.s
Define nLength.l
Dim t_vk.c(256)
;******************************************************************************************************
;********************************** DEBUT de recherche d'un module déjà en mémoire ********************
;******************************************************************************************************
Structure inf_wnd
pid.l
hwnd.l
NOM_EXE.s{#MAX_PATH}
nom_WND.s{#MAX_PATH}
ind.w
EndStructure
NewMap info_wdn.inf_wnd()
Structure E_T_CM ; élément de la table Commande langage Microsoft
E.s{1} ; permet de différencier Commande directe et langage Microsoft "M" pour Microsoft et "C" pour commande
StructureUnion
M.s{100}
C.l
M4.s{4}[24]
EndStructureUnion
EndStructure
Structure CMD_ID_HELP
L_PP.s{8}
ID.s{4}
BOUT.s{11}
L_MS.s{8}
INF.s{120}
EndStructure
Structure S_coll
IND_s.s{8}
ind.l
EndStructure
Dim T_CM.E_T_CM(100)
; Dim AIDE_h.s(50)
;****** CHARGEMENT DE LA MAP ******
; ********* ATTENTION à partir du CTRL_ID=306 il y a une différence de +1 sur les CTRL_ID de la CALCULETTE_PLUS
NewMap Instr.l()
Global NewMap CMD_H.CMD_ID_HELP()
Global NewMap CMD_S.S_coll()
; Global Dim tab_ban.s{11}(120)
Global Dim tab_ban.s(120)
;********************************************TRI COLONNE d'un gadget Listicongadget ********************************************************
;********************************************TRI COLONNE d'un gadget Listicongadget********************************************************
Structure PB_ListIconItem
UserData.l
EndStructure
#LVM_SETEXTENDEDLISTVIEWSTYLE=#LVM_FIRST+54
#LVM_GETEXTENDEDLISTVIEWSTYLE=#LVM_FIRST+55
Global ListIconGadget.l,Buffer1.l,Buffer2.l,lvi.LV_ITEM,updown.l,lastcol.l
Buffer1=AllocateMemory(128)
Buffer2=AllocateMemory(128)
Procedure CompareFunc(*item1.PB_ListIconItem,*item2.PB_ListIconItem,lParamSort)
Protected result,Seeker1,Seeker2,done,char1,char2
result=0
lvi\iSubItem=lParamSort
lvi\pszText=Buffer1
lvi\cchTextMax=512
lvi\Mask=#LVIF_TEXT
SendMessage_(ListIconGadget,#LVM_GETITEMTEXT,*item1\UserData,@lvi)
lvi\pszText=Buffer2
SendMessage_(ListIconGadget,#LVM_GETITEMTEXT,*item2\UserData,@lvi)
Seeker1=Buffer1
Seeker2=Buffer2
done=0
While done=0
char1=Asc(UCase(Chr(PeekB(Seeker1))))
char2=Asc(UCase(Chr(PeekB(Seeker2))))
result=(char1-char2)*updown
If result<>0 Or (Seeker1-Buffer1)>511
done=1
EndIf
Seeker1+1
Seeker2+1
Wend
ProcedureReturn result
EndProcedure
Procedure UpdatelParam()
Protected i.l,lTmp.l,lRecs.l,lvi.LV_ITEM
lRecs=SendMessage_(ListIconGadget,#LVM_GETITEMCOUNT,0,0)
For i=0 To lRecs-1
SetGadgetItemData(GetDlgCtrlID_(ListIconGadget),i,i)
Next
EndProcedure
Procedure ColumnClickCallback(hwnd,uMsg,wParam,lParam)
Protected result,*msg.NMHDR,*pnmv.NM_LISTVIEW,WindowWidth,WindowHeight
result=#PB_ProcessPureBasicEvents
Select uMsg
Case #WM_NOTIFY
*msg.NMHDR=lParam
If *msg\hwndFrom=ListIconGadget And *msg\code=#LVN_COLUMNCLICK
*pnmv.NM_LISTVIEW=lParam
If lastcol<>*pnmv\iSubItem
updown=1
EndIf
SendMessage_(ListIconGadget,#LVM_SORTITEMS,*pnmv\iSubItem,@CompareFunc())
UpdatelParam()
UpdateWindow_(ListIconGadget)
lastcol=*pnmv\iSubItem
updown=-updown
EndIf
Case #WM_SIZE
If hwnd=WindowID(0) And IsIconic_(hwnd)=0
WindowWidth=lParam & $FFFF
WindowHeight=lParam>>16
ResizeGadget(0,0,0,WindowWidth,WindowHeight)
result=1
EndIf
EndSelect
ProcedureReturn result
EndProcedure
;******************************************** FIN TRI COLONNE d'un gadget Listicongadget ********************************************************
;******************************************** FIN TRI COLONNE d'un gadget Listicongadget ********************************************************
; ******************* debut des Procedures de création d'une map avec les principales caractéristiques de chaque fenêtre ********************
; ******************* debut des Procedures de création d'une map avec les principales caractéristiques de chaque fenêtre ********************
ProcedureDLL GET_PID_NOM_WND(Name.s)
Protected recherche,CreateToolhelpSnapshot,ProcessFirst,ProcessNext,Process.PROCESSENTRY32,Snapshot,ProcessFound,Nom.s,Pid
Name.s=UCase(Name.s)
Recherche=0
If OpenLibrary(0,"Kernel32.dll")
CreateToolhelpSnapshot=GetFunction(0,"CreateToolhelp32Snapshot")
ProcessFirst=GetFunction(0,"Process32First")
ProcessNext=GetFunction(0,"Process32Next")
If CreateToolhelpSnapshot And ProcessFirst And ProcessNext ; Ensure than all the functions are found
Process.PROCESSENTRY32\dwSize=SizeOf(PROCESSENTRY32)
Snapshot=CallFunctionFast(CreateToolhelpSnapshot,#TH32CS_SNAPPROCESS,0)
If Snapshot
ProcessFound=CallFunctionFast(ProcessFirst,Snapshot,Process)
While ProcessFound
Nom.s=UCase(PeekS(@Process\szExeFile))
Nom=GetFilePart(Nom)
If Nom=Name
Recherche=1
Pid=Process\th32ProcessID
EndIf
ProcessFound=CallFunctionFast(ProcessNext,Snapshot,Process)
Wend
EndIf
CloseHandle_(Snapshot)
EndIf
CloseLibrary(0)
EndIf
ProcedureReturn Pid
EndProcedure
ProcedureDLL KILL_PROCESS(Pid) ; Kill a process by specifying it's Pid
Protected phandle,Result
phandle=OpenProcess_(#PROCESS_TERMINATE,#False,Pid)
If phandle<>#Null
If TerminateProcess_(phandle,1)
Result=#True
EndIf
CloseHandle_(phandle)
EndIf
ProcedureReturn Result
EndProcedure
Procedure.s GET_PID_NOM_EXE(hWnd.l)
Protected pid.l,hProcess.l, Name.s,*F
pid.l=0
GetWindowThreadProcessId_(hWnd,@pid)
hProcess.l=OpenProcess_(#PROCESS_ALL_ACCESS,0,pid);
Name.s=Space(256)
If OpenLibrary(0,"PSAPI.DLL")
*F=GetFunction(0,"GetModuleFileNameExA")
If *F
CallFunctionFast(*F,hProcess,0,@Name,#MAX_PATH)
Else
MessageRequester("Erreur PSAPI.DLL","Fonction GetModuleFileNameExA non trouvé",0)
CloseLibrary(0)
End
EndIf
Else
MessageRequester("Erreur PSAPI.DLL","Library non ouverte",0)
End
EndIf
ProcedureReturn Str(pid)+"@"+Name
EndProcedure
Procedure FIND_COLLISION(PID.l,hWnd.l,NOM_exe_path.s,NOM_WND.s,Map INFO_W.inf_wnd(),TYP.s="T")
Protected indi.l,indi$,type_c.s,NOM_EXE.s,indiM.l
;code pour la cle dans map afin d'éviter les collisions
; "H"+str(ind)+str(hwnd)
; "P"+str(ind)+str(pid)
; "E'+str(ind)+Nom_EXE
; "W"+str(ind)+NOm_Wnd
;*************** Pas de collision sur handle c'est impossible qu'il puisse y avoir 2 handles identiques donc info_w()\ind=1
;*************** Sur PID j'ai 1 PID double sur Purebasic !!!!
;*************** NOM_exe et NOM_WND peuvent être présent en plusieurs occurrences.
Macro _CHERC_COLL(_typ,_types)
indi=0
Repeat
indi+1
indi$=_typ+Str(indi)+" "+_types ; Blanc ou space sépare le type et son occurrence du nom de la clé. On peut placer ici un autre caractère alpha ou rien
; res_find=FindMapElement(info_w(),indi$)
Until FindMapElement(info_w(),indi$)=0
info_w(indi$)\hwnd=hwnd
info_w()\pid=PID
info_w()\nom_WND=NOM_WND
info_w()\NOM_EXE=NOM_EXE_PATH
info_w()\ind=indi
If indi>1
indiM.l=indi
indi=1
indi$=_typ+Str(indi)+" "+_types ; Blanc ou space sépare le type et son occurrence du nom de la clé. On peut placer ici un autre caractère alpha ou rien
info_w(indi$)\ind=indiM
EndIf
EndMacro
;code pour la clé dans map afin d'éviter les collisions
; "H"+str(ind)+str(hwnd)
; "P"+str(ind)+str(pid)
; "E'+str(ind)+Nom_EXE
; "W"+str(ind)+NOm_Wnd
; "T" toutes les clés précédentes
NOM_EXE.s=GetFilePart(NOM_EXE_PATH)
If typ="E" Or typ="T":type_c="E":_CHERC_COLL(type_c,NOM_EXE) :EndIf
If typ="P" Or typ="T":type_c="P":_CHERC_COLL(type_c,Str(PID)) :EndIf
If typ="H" Or typ="T":type_c="H":_CHERC_COLL(type_c,Str(hWnd)) :EndIf
If typ="W" Or typ="T":type_c="W":_CHERC_COLL(type_c,Nom_Wnd) :EndIf
EndProcedure
Procedure FIND_WINDOWS_INFOS(Map INFO_W.inf_wnd(),TYP.s="T")
Protected NOM_WND.s,hwndp.l,PID_NOM_EXE_PATH.s,PID,NOM_EXE_PATH.s,nom_exe.s
Static hWnd.l
ClearMap(info_w())
;code pour la cle dans map afin d'éviter les collisions sur PID , NOM_EXE et NOM_WND
; "H"+str(ind)+str(hwnd)
; "P"+str(ind)+str(pid)
; "E'+str(ind)+Nom_EXE
; "W"+str(ind)+NOm_Wnd
; "T" toutes les clés précédentes
hWnd=FindWindow_(0,0)
While hWnd<>0
If GetWindowLong_(hWnd,#GWL_STYLE) & #WS_VISIBLE=#WS_VISIBLE
If GetWindowLong_(hWnd,#GWL_EXSTYLE) & #WS_EX_TOOLWINDOW<>#WS_EX_TOOLWINDOW
NOM_WND.s=Space(#MAX_PATH)
GetWindowText_(hWnd,@NOM_WND,#MAX_PATH)
hwndp.l=GetParent_(hWnd)
If NOM_WND<>""
PID_NOM_EXE_PATH.s=GET_PID_NOM_EXE(hWnd)
PID=Val(StringField(PID_NOM_EXE_PATH,1,"@"))
NOM_EXE_PATH.s=StringField(PID_NOM_EXE_PATH,2,"@")
nom_exe.s=GetFilePart(NOM_EXE_PATH)
;************** recherche de collision ***************************
FIND_COLLISION(PID,hWnd,nom_exe_path,NOM_WND,INFO_W(),typ)
EndIf
EndIf
EndIf
hWnd=GetWindow_(hWnd,#GW_HWNDNEXT)
Wend
EndProcedure
; ******************* Fin des Procedures de création d'une map avec les principales caractéristiques de chaque fenêtre ********************
;******************************************************************************************************
;********************************** FIN de recherche d'un module déjà en mémoire ********************
;******************************************************************************************************
;***************************************************************************************************************************
;********************************** Chargement des commandes de base et analyse des commandes envoyées ********************
;***************************************************************************************************************************
Procedure FIND_COLL_H(L_PP.S,ID.S,BOUT.s,L_MS.s,Map CMD_S.S_coll())
Protected indi.l,indi$,type_c.s,NOM_EXE.s,type_a.s,REST.l,M_L_PP.s,CARa$,type_b.s
Macro _CHER_COLL_H(_types)
indi=0
Repeat
indi+1
indi$=Str(indi)+" "+_types ; Blanc ou space sépare le type et son occurrence du nom de la clé. On peut placer ici un autre caractère alpha ou rien
REST.l=FindMapElement(CMD_S(),indi$)
If rest<>0
If cmd_s()\IND_s=L_PP
M_L_PP.s=L_PP
Else
M_L_PP.s=""
EndIf
EndIf
Until REST=0
If M_L_PP<>L_PP
CMD_S(indi$)\IND_s=L_PP
CMD_S(indi$)\ind=indi
If indi>1
indi$="1 "+_types ; Blanc ou space sépare son occurrence du nom de la clé. On peut placer ici un autre caractère alpha ou rien
CMD_S(indi$)\ind=indi
EndIf
EndIf
EndMacro
type_a.s=L_PP:_CHER_COLL_H(type_a)
CARa$=Left(L_PP,1)
If CARa$<>UCase(cara$)
If UCase(L_PP)<>L_PP
_CHER_COLL_H(UCase(L_PP))
Else
_CHER_COLL_H(LCase(L_PP))
EndIf
EndIf
If cara$<>type_a
_CHER_COLL_H(UCase(cara$))
_CHER_COLL_H(LCase(cara$))
EndIf
If type_a<>ID:type_b.s=ID:_CHER_COLL_H(type_b)
CARa$=Left(ID,1)
If CARa$<>UCase(cara$)
If UCase(ID)<>ID
_CHER_COLL_H(UCase(ID))
Else
_CHER_COLL_H(LCase(ID))
EndIf
EndIf
EndIf
If cara$<>ID:_CHER_COLL_H(cara$):EndIf
If type_a<>type_b And type_a<>L_MS And type_b<>L_MS :type_c=L_MS:_CHER_COLL_H(type_c)
CARa$=Left(L_MS,1)
If CARa$<>UCase(cara$)
If UCase(ID)<>L_MS
_CHER_COLL_H(UCase(L_MS))
Else
_CHER_COLL_H(LCase(L_MS))
EndIf
EndIf
:EndIf
If cara$<>L_MS:_CHER_COLL_H(cara$):EndIf
EndProcedure
Procedure.l ANALYSE_CM(TXT$,Array PT_CM.E_T_CM(1), Map Instr.l())
Protected el,Pos1,Text1$,ltxt1.l,ltxt.l,Pos2,txt1$,ii,txt2$,ltxt2,Ptxt.l,ctxt.l
; *** analyse de langage de typr MMMMM [ID\ID\ID,] MMMMMMM [ID\ID] MMMMM [ID].....avec MMM.. pour langage Microsoft et [ID] pour Commande CTRL_ID
el=-1
Repeat
Pos1=FindString(TXT$,"[",1)
If pos1<>0
Text1$=Mid(TXT$,1,Pos1-1) ; text1$ est du langage microsoft
TXT$=Mid(TXT$,Pos1+1)
ltxt1.l=Len(text1$)
ltxt.l=Len(txt$)
Else
text1$=txt$:txt$=""
ltxt1=Len(text1$):ltxt=0
EndIf
If ltxt1<>0
el+1
PT_CM(el)\E="M":PT_CM(el)\M=TEXT1$
EndIf
;*** Analyse entre [] commandes séparées par des \ (anti slash)
If ltxt<>0
Pos2=FindString(TXT$,"]",1)
txt1$=Mid(TXT$,1,pos2-1)
TXT$=Mid(TXT$,Pos2+1)
ii=1
Repeat
txt2$=StringField(TXT1$,ii,"\"); txt2$ est une ou plusieurs commandes CTRL_ID séparées par des \ (anti slash)
ltxt2=Len(txt2$)
If ltxt2>0
;**************** recheche du code CTRL_ID dand la table MAP
Ptxt.l=FindMapElement(instr(),txt2$)
If ptxt<>0
ctxt.l=PeekL(ptxt)
If ctxt<>0
el+1
PT_CM(el)\E="C":PT_CM(el)\C=ctxt:PT_CM(el)\M4[2]=txt2$
Else
MessageRequester("Erreur sur la Commande :",txt2$+" de l'instructruction :"+TXT1$+" indice \ "+Str(ii))
EndIf
Else
MessageRequester("Erreur sur la Commande :",txt2$+" de l'instructruction :"+TXT1$+" indice \ "+Str(ii))
EndIf
EndIf
ii+1
Until ltxt2=0
EndIf
Until ltxt=0
ProcedureReturn el
EndProcedure
;***************************************************************************************************************************
;*************************** FIN de chargement des commandes de base et analyse des commandes envoyées ********************
;***************************************************************************************************************************
;*********************************************************************************************************************************
;*************************************** Pilotage de la calculatrice Windows ************************************************
;*********************************************************************************************************************************
Procedure.l GET_HWND_FROM_NOM_WND(name_wnd.s); Cherche le Handle de la fenêtre à partir du nom de la fenêtre
Protected Np,hWnd
Static hMainWndM,tempo.l=110,FLAG0=0
Np=0
While hWnd=0 And Np<200
hWnd=FindWindow_(0,name_wnd) ; Cherche le Handle de la fenêtre à partir du nom de la fenêtre
Delay(1)
Np+1
Wend
hMainWnd=hWnd
If hMainWnd<>hMainWndM And hMainWndM<>0
; MessageRequester("ATTENTION","Handle modifié New hWnd="+Str(hMainWnd)+" Préc hWnd="+Str(hMainWndM))
; TextGadget(#TEXT_GAD2,168,40,500,15,"ATTENTION"+" Handle modifié New hWnd="+Str(hMainWnd)+" Préc hWnd="+Str(hMainWndM))
; SetGadgetColor(#TEXT_GAD2, #PB_Gadget_FrontColor , RGB(255,0,0))
; TextGadget(#TEXT_GAD1,770,40,60,15,"calc cachée")
SetGadgetColor(#TEXT_GAD1,#PB_Gadget_FrontColor,RGB(255,0,0))
Else
; TextGadget(#TEXT_GAD2,168,40,500,15,"")
SetGadgetColor(#TEXT_GAD1,#PB_Gadget_FrontColor,RGB(0,0,0))
EndIf
hMainWndM=hMainWnd
ProcedureReturn hwnd
EndProcedure
Procedure.l CHERCHE_STAT() ; Cherche le handle de la fenêtre statistique
;*************** Fenêtre des Statistiques ********************** n'est pas encore utilisé dans le PRG
Protected Wnd_stat
Static Whnd_stat,tempo.l=110
; d_t.l=ElapsedMilliseconds()
Delay(tempo*3)
Wnd_stat=FindWindow_(0,"Statistiques") ; Cherche le Handle de la fenêtre
PID_calc=GET_PID_NOM_WND(NOM_EXE$) ; On cherche le numéro PID qui lui est attribué au handle
; phandle = OpenProcess_ (#PROCESS_TERMINATE, #False, Pid) ; retrouve le handle à partir du PID
; Delay(tempo*3)
If Wnd_stat=0
MessageRequester("ERREUR !","**************** Fenêtre Stat non trouvée")
End
EndIf
ProcedureReturn whnd_stat
EndProcedure
Procedure PAUSE(tmp.l)
hmainWnd=GET_HWND_FROM_NOM_WND(NOM_WND$)
Delay(TMP)
EndProcedure
Procedure.s WM_COMMANDE(hMainWnd,Num,lparam=0)
Protected R_WM_COMMANDE,sbuffer.s
R_WM_COMMANDE=SendMessage_(hMainWnd,#WM_COMMAND,num,lparam)
If num=300
sbuffer.s=Space(256)
ProcedureReturn GetClipboardText()
EndIf
EndProcedure
Procedure.s EXE_WHND(whnd.l,entree$)
entree$=Trim(entree$)
SetClipboardText(entree$)
WM_COMMANDE(whnd,301); touche_ctrl(#VK_V) coller
sbuffer.s=WM_COMMANDE(whnd,300); touche_ctrl(#VK_C) copier
If entree$=sbuffer
SendMessage_(whnd,#WM_COMMAND,81,0)
ProcedureReturn " erreur instruction (div/0 ou mauvaise instruction)"
EndIf
ProcedureReturn GetClipboardText()
EndProcedure
;*********************************************************************************************************************************
;*************************************** FIN Pilotage de la calculatrice Windows ************************************************
;*********************************************************************************************************************************
; ******************************************* Ouverture de la fenetre et des gadgets *********************************************
Procedure OpenWindow_Window_0()
Protected textegad2$
If OpenWindow(#Window_0, 452, 208, 836, 600, "Pilote calculatrice", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MinimizeGadget | #PB_Window_TitleBar)
ComboBoxGadget(#ComboBox_1, 5, 10, 755, 20, #PB_ComboBox_Editable)
ListIconGadget(#ListView_2, 5, 160, 820, 435, " Formules ", 540, #PB_ListIcon_FullRowSelect)
; ListIconGadget(#ListView_2, 5, 145, 820, 435, " Formules ", 540, #PB_ListIcon_FullRowSelect)
ButtonGadget(#Button_3, 770, 10, 60, 20, "OK")
CheckBoxGadget(#CheckBox_1, 740, 40, 15, 15, "")
TextGadget(#TEXT_GAD1, 765, 40, 60, 15, "calc cachée")
ComboBoxGadget(#ComboBox_7, 5, 40, 100, 20)
ComboBoxGadget(#ComboBox_8, 110, 40, 115, 20, #PB_ComboBox_Editable)
ButtonGadget(#Button_8, 235, 40, 60, 20, "Help")
textegad2$="Chercher le type puis sur le choix de la Cmd enfin sur Help pour recherchez les infos"
textegad2$+" Les commandes sont sensibles à la Case donc ATTENTION minuscule majuscule"
TextGadget(#TEXT_GAD2, 320, 35, 405, 30, textegad2$)
AddGadgetColumn(#ListView_2,1," Résultats ",260)
If CreateMenu(0,WindowID(#Window_0))
MenuTitle("Aide")
MenuItem(1,"Aide MS")
; MenuItem(2,"Aide PP")
; MenuItem(3,"Aide Gen")
EndIf
AddKeyboardShortcut(#Window_0,#PB_Shortcut_F1,#Help)
If LoadFont(1,"Courier New",8)
SetGadgetFont(#ComboBox_1,FontID(1))
EndIf
AddGadgetItem(#ComboBox_7,-1,"Option[xx]")
AddGadgetItem(#ComboBox_7,-1,"Langage MS")
AddGadgetItem(#ComboBox_7,-1,"Boutons")
SetGadgetState(#ComboBox_7, 2) ; Sélectionne le troisième élément (la numérotation commence à 0)
ListIconGadget=ListIconGadget(#ListIcon_11, 5, 65, 820, 90,"[Xxx]",50,#PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
AddGadgetColumn(#ListIcon_11,1,"MS ",50)
AddGadgetColumn(#ListIcon_11,2,"Bouton",75)
AddGadgetColumn(#ListIcon_11,3," ID ",30)
AddGadgetColumn(#ListIcon_11,4," Aide ",610)
SetGadgetItemColor(#ListIcon_11, -1, #PB_Gadget_BackColor , RGB(255, 255, 0)) ; [, Colonne])
; Si Etat = 0, le gadget est activé. Si Etat = 1, le gadget est désactivé
DisableGadget(#ListIcon_11, 1)
HideGadget(#ListIcon_11, 1)
ListIconGadget(#ListIcon_9, 5, 65, 820, 90, "Aide Générale", 800, #PB_ListIcon_FullRowSelect)
DisableGadget(#ListIcon_9, 0)
HideGadget(#ListIcon_9, 0)
EndIf
EndProcedure
Procedure charge_combo()
Protected Option$,Choix_Comb8$,i,j
AddGadgetItem(#ComboBox_1,-1," $ ******************** Langage de microsoft normal ************************ ")
AddGadgetItem(#ComboBox_1,-1,":c:q $ ici réinitialisation de la calculette ")
AddGadgetItem(#ComboBox_1,-1,":c:q 2024!= $ ***** Factorielle 2014")
AddGadgetItem(#ComboBox_1,-1,":c:q 50000!= $ ***** Factorielle 50000 Calcul long avec message laissez ou tapez Continuer")
AddGadgetItem(#ComboBox_1,-1,":c:q 20000!= $ ***** Factorielle 20000")
AddGadgetItem(#ComboBox_1,-1,":c:q 1,1414!= $ ***** Fonction Gamma d'Euler pour nombre décimaux")
AddGadgetItem(#ComboBox_1,-1,":c:q 24/8+4*25= $ Donne 3+100=103") ;
AddGadgetItem(#ComboBox_1,-1,":c:q 24/8+4=*25= $ donne (3+4)*25=175 ") ;
AddGadgetItem(#ComboBox_1,-1,":c:q (6-7)*(34-32)= $ ")
AddGadgetItem(#ComboBox_1,-1,":c:q((5-3)*(89-87))/4= $ ")
AddGadgetItem(#ComboBox_1,-1,":c:q 48/((5,45-3)*(89-87))= $")
AddGadgetItem(#ComboBox_1,-1,":c:q(24,89*2)/((5-3)*(89-87))= $**; initialisation avant opération avec :c et :q")
AddGadgetItem(#ComboBox_1,-1,":m=0,004567e+10= $ entrée format scientifique") ; entrée format scientifique pas :c :q ???
AddGadgetItem(#ComboBox_1,-1,":c:q i1n= $**** donne e=2,718...") ; donne e=2,718... pas de :c:q ???
AddGadgetItem(#ComboBox_1,-1,":c:q p= $**** donne Pi=3,14159...") ; donne e=2,718...
AddGadgetItem(#ComboBox_1,-1,":c:q(24*2)/((5-3)*(89-87))= $ formule avec des parenthéses") ; Formule complexe
AddGadgetItem(#ComboBox_1,-1,":c:q(52!)/(39!*13!)= $ Combinaison de 52 par 13") ; Formule complexe
AddGadgetItem(#ComboBox_1,-1,":c:q(52!)/(13!y4)= $ Distribution de 52 cartes à 4 joueurs") ; Formule complexe
AddGadgetItem(#ComboBox_1,-1,":c:q(52!)/(13!y4)= $ Distribution de 52 cartes à 4 joueurs sans tenir compte de l'ordre des joueurs") ; Formule complexe
AddGadgetItem(#ComboBox_1,-1,":c:q(52!)*4!/(13!y4)= $ Distribution de 52 cartes à 4 joueurs en tenant compte de l'ordre des joueurs") ; Formule complexe
AddGadgetItem(#ComboBox_1,-1,":c:q ")
AddGadgetItem(#ComboBox_1,-1,":c:q $******* LES COS SIN TANG ***********")
AddGadgetItem(#ComboBox_1,-1,":c:q 30o= $** Cosinus(30) ") ; Formule cosinus
AddGadgetItem(#ComboBox_1,-1,":c:q 30s= $** Sinus(30)") ; Formule sinus
AddGadgetItem(#ComboBox_1,-1,":c:q 30t= $** tangente(30)") ; Formule tangente
AddGadgetItem(#ComboBox_1,-1,":c:q 60o= $** cosinus(60)") ; Formule cosinus
AddGadgetItem(#ComboBox_1,-1,":c:q 60s= $** sinus(60)") ; Formule sinus
AddGadgetItem(#ComboBox_1,-1,":c:q 60t= $** tangente(60)") ; Formule tangente
AddGadgetItem(#ComboBox_1,-1,":c:q ")
AddGadgetItem(#ComboBox_1,-1,":c:q = $******* LES ARCSIN ARCCOS ARCTANG ***********")
AddGadgetItem(#ComboBox_1,-1,":c:q i0,866 o= $** ArcCosinus(0,866) ") ; Formule cosinus
AddGadgetItem(#ComboBox_1,-1,":c:q i0,5s= $** ArcSinus(0,5)") ; Formule sinus
AddGadgetItem(#ComboBox_1,-1,":c:q i1,732t= $** Arctangente(1,732)") ; Formule tangente
AddGadgetItem(#ComboBox_1,-1,":c:q i0,5o= $** Arccosinus(0,5)") ; Formule cosinus
AddGadgetItem(#ComboBox_1,-1,":c:q ")
AddGadgetItem(#ComboBox_1,-1,":c:q = $******* LES COS SIN TANG Hyperboliques ***********")
AddGadgetItem(#ComboBox_1,-1,":c:q H 0,9 o= $** Cosinus hyper (0,9) ") ; Formule cosinus
AddGadgetItem(#ComboBox_1,-1,":c:q H 0,9 s= $** Sinus hyper(0,9)") ; Formule sinus
AddGadgetItem(#ComboBox_1,-1,":c:q H 0,9 t= $** tangente hyper(0,9)") ; Formule tangente
AddGadgetItem(#ComboBox_1,-1,":c:q H -0,9 o= $** cosinus hyper(-0,9)") ; Formule cosinus
AddGadgetItem(#ComboBox_1,-1,":c:q H -0,9 s= $** sinus hyper(-0,9)") ; Formule sinus
AddGadgetItem(#ComboBox_1,-1,":c:q H -0,9 t= $** tangente hyper(-0,9)") ; Formule tangente
AddGadgetItem(#ComboBox_1,-1,":c:q ")
AddGadgetItem(#ComboBox_1,-1,":c:q = $******* LES ARCCOS ARCSIN ARCTANG Hyperboliques ***********")
AddGadgetItem(#ComboBox_1,-1,":c:q H i1,9 o= $** ARCCosinus hyper (1,9) ") ; Formule cosinus
AddGadgetItem(#ComboBox_1,-1,":c:q H i0,9 s= $** ARCSinus hyper(0,9)") ; Formule sinus
AddGadgetItem(#ComboBox_1,-1,":c:q H i0,9 t= $** ARCtangente hyper(0,9)") ; Formule tangente
AddGadgetItem(#ComboBox_1,-1,":c:q ")
AddGadgetItem(#ComboBox_1,-1,"16l=:m $ ; Log base10 de 16") ; Log base10 de 16
AddGadgetItem(#ComboBox_1,-1,"i1nl=:m $ log base 10 de e") ; log base 10 de e
AddGadgetItem(#ComboBox_1,-1,":c:q10@*p= $ surface d'un cercle 3,14*R*R") ; surface d'un cercle 3,14*R*R
AddGadgetItem(#ComboBox_1,-1,":c:q10@*p*4= $ surface d'une sphére 3,14*R*R*4") ;
AddGadgetItem(#ComboBox_1,-1,":c:q10#*p*4/3= $ Volume d'une sphére 3,14*R*R*R*4/3") ;
AddGadgetItem(#ComboBox_1,-1,":c:q13n/10n= $ Changement de base d'un log =Log10(13) à partir de Loge(13)");
AddGadgetItem(#ComboBox_1,-1,":c:q13l= $ Résultat =Log10(13)");
AddGadgetItem(#ComboBox_1,-1,":c:q $ Initialisation ")
AddGadgetItem(#ComboBox_1,-1,":c:q = $******* Calcul sur plusieurs lignes ***********")
AddGadgetItem(#ComboBox_1,-1," :c:q(24*2)+3 = $ Calcul sur 2 lignes ceci est la première ligne à exécuter avec ou sans =")
AddGadgetItem(#ComboBox_1,-1,"/((5-3)*(89-87))= $ Calcul sur 2 lignes ceci est la deuxième ligne à exécuter")
AddGadgetItem(#ComboBox_1,-1,":c:q(24*2)+3/((5-3)*(89-87))= $ Même calcul sur une seule ligne ")
AddGadgetItem(#ComboBox_1,-1,":c:q ")
AddGadgetItem(#ComboBox_1,-1," $ ******************** Commandes avec CTRL_ID et Langage MIcrosoft ************************ ")
AddGadgetItem(#ComboBox_1,-1,":c:q[MST\P2\MSC] $ Initialisation en mode scientifique avec temporisation de 2 secondes ")
AddGadgetItem(#ComboBox_1,-1,"[CAN\CE]i1n= $**** donne e=2,718...") ; donne e=2,718... pas de :c:q ???
AddGadgetItem(#ComboBox_1,-1,"[CAN\CE\Dec]120 :m [Hex]= $*** Conversion 120 décimal en Hexadécimal= 78") ;
AddGadgetItem(#ComboBox_1,-1,"[CAN\CE\Dec\1\2\0\Hex]= $*** Autre façon de Convertir 120 décimal en 78 Hexadécimal") ;
AddGadgetItem(#ComboBox_1,-1,"[CAN\CE\Dec]511 :m [Hex]= $*** Conversion 511 décimal en Hexadécimal") ;
AddGadgetItem(#ComboBox_1,-1,"[CAN\CE\Dec\]4294967295 :m [Hex]= $*** Conversion décimal en Hexadécimal") ;
AddGadgetItem(#ComboBox_1,-1,"[CAN\CE\Hex\]FFFFFFFF :m [Dec]= $*** Conversion Hexadécimal en décimal ") ;
AddGadgetItem(#ComboBox_1,-1,"[CAN\CE\Dec]=[I305] $*** passage en mode standard ") ;
AddGadgetItem(#ComboBox_1,-1,"[CAN\CE\Dec]=[I304] $*** passage en mode scientifique ") ;
AddGadgetItem(#ComboBox_1,-1,"[CAN\CE\Dec]120 :m [Hex]= [P10\Dec]= $*** Conversion 120 décimal en Hexadécimal= 78")
; **************************charge le combobax8 aà partir de l'option Option[xx] qui peut être changé
; AddGadgetItem(#ComboBox_7,-1,"Option[xx]")
; AddGadgetItem(#ComboBox_7,-1,"Langage MS")
; AddGadgetItem(#ComboBox_7,-1,"Boutons")
Option$=GetGadgetText(#ComboBox_7)
i=0
ForEach CMD_H()
Select option$
Case "Option[xx]"
Choix_Comb8$=cmd_h()\L_PP
Case "Langage MS"
Choix_Comb8$=cmd_h()\L_MS
Case "Boutons"
Choix_Comb8$=cmd_h()\BOUT
Default
Choix_Comb8$=cmd_h()\BOUT
EndSelect
; AddGadgetItem(#ComboBox_8,-1,Choix_Comb8$)
tab_ban(i)=Choix_Comb8$
i+1
Next
ReDim tab_ban(i-1)
SortArray(tab_ban(),#PB_Sort_Ascending | #PB_Sort_NoCase);,0,i-1)
; SortArray(tab_ban(), #PB_Sort_NoCase );,0,i-1)
For j=0 To i-1
If tab_ban(j)<>""
AddGadgetItem(#ComboBox_8,-1,tab_ban(j))
EndIf
Next
EndProcedure
;*************************************************Début du Prg Principal ****************************************************
Procedure Charge_gadget9()
Protected i,AIDE$
DisableGadget(#ListIcon_11,1)
DisableGadget(#ListIcon_9,0)
HideGadget(#ListIcon_11,1)
HideGadget(#ListIcon_9,0)
ClearGadgetItems(#ListIcon_9)
Restore AIDE_GEN
; If LoadFont(1,"Courier new",7,#PB_Font_Bold)
; SetGadgetFont(#ListIcon_9,FontID(1)) ; la police par défaut est remplacée par celle chargée (Courier new 7.5)
; EndIf
; i=0
Repeat
Read.s AIDE$
If aide$<>"FIN"
AddGadgetItem(#ListIcon_9,-1,aide$)
SetGadgetItemColor(#ListIcon_9,-1,#PB_Gadget_BackColor,RGB(255,255,90),0) ; [, Colonne])
; i+1
EndIf
Until AIDE$="FIN"
AddGadgetItem(#ListIcon_9,-1,"************************************************************************************************************************")
SetGadgetItemColor(#ListIcon_9,-1,#PB_Gadget_BackColor,RGB(255,255,90),0) ; [, Colonne])
AddGadgetItem(#ListIcon_9,-1,"** Voici queques exemples à votre disposition dans la fenêtre de commande de la calculatyrice **")
SetGadgetItemColor(#ListIcon_9,-1,#PB_Gadget_BackColor,RGB(255,255,90),0) ; [, Colonne])
AddGadgetItem(#ListIcon_9,-1,"************************************************************************************************************************")
SetGadgetItemColor(#ListIcon_9,-1,#PB_Gadget_BackColor,RGB(255,255,90),0) ; [, Colonne])
For i=0 To CountGadgetItems(#ComboBox_1)
AddGadgetItem(#ListIcon_9,-1, GetGadgetItemText(#ComboBox_1,i))
SetGadgetItemColor(#ListIcon_9,-1,#PB_Gadget_BackColor,RGB(255,255,90),0) ; [, Colonne])
; Debug GetGadgetItemText(#ComboBox_1,i)
Next
; FreeFont(1)
EndProcedure
Procedure Charge_gadget11(Choix_AId$)
Protected textex$,indi,indi$,res_f,ind_max.l,j,clef$,res_f2,texte$,texte2$
DisableGadget(#ListIcon_9,1)
DisableGadget(#ListIcon_11,0)
HideGadget(#ListIcon_9, 1)
HideGadget(#ListIcon_11, 0)
; ClearGadgetItems(#ListIcon_9)
ClearGadgetItems(#ListIcon_11)
If Choix_AId$="?" Or Choix_AId$="??"
ForEach CMD_H()
textex$=CMD_H()\L_PP+Chr(10)+CMD_H()\L_MS+Chr(10)+CMD_H()\BOUT+Chr(10)+CMD_H()\ID+Chr(10)+CMD_H()\INF
AddGadgetItem(#ListIcon_11,0,textex$)
SetGadgetItemColor(#ListIcon_11, -1, #PB_Gadget_BackColor , RGB(245, 245, 220),0) ; [, Colonne])
SetGadgetItemColor(#ListIcon_11, -1, #PB_Gadget_BackColor , RGB(255, 255, 190),1) ; [, Colonne])
SetGadgetItemColor(#ListIcon_11, -1, #PB_Gadget_BackColor , RGB(255, 255, 90),2) ; [, Colonne])
; SetGadgetItemColor(#ListIcon_11, -1, #PB_Gadget_BackColor , RGB(230, 230, 250),3) ; [, Colonne])
SetGadgetItemColor(#ListIcon_11, -1, #PB_Gadget_BackColor , RGB(255, 217, 148),3) ; [, Colonne])
SetGadgetItemColor(#ListIcon_11, -1, #PB_Gadget_BackColor , RGB(255, 255, 0),4) ; [, Colonne])
Next
Else
indi=1
indi$=Str(indi)+" "+Choix_AId$ ; Blanc ou space sépare le type et son occurrence du nom de la clé. On peut placer ici un autre caractère alpha ou rien
res_f=FindMapElement(CMD_S(),indi$)
;*******************************************************
; Define el1.inf_wnd=info_wdn()
If res_f<>0
Else
; Debug indi$+" pas touvée"
Choix_AId$=Left(Choix_AId$,1)
indi$=Str(indi)+" "+Choix_AId$ ; Blanc ou space sépare le type et son occurrence du nom de la clé. On peut placer ici un autre caractère alpha ou rien
res_f=FindMapElement(CMD_S(),indi$)
If res_f=0
MessageRequester ("ERREUR de RECHERCH", indi$+" pas touvée",0)
EndIf
EndIf
ind_max.l=CMD_S()\ind
For j=1 To ind_max
clef$=Str(j)+" "+Choix_AId$
res_f2=FindMapElement(CMD_S(),clef$)
FindMapElement(CMD_H(),CMD_S()\IND_s)
texte$="cle_R="+clef$+" clé="+MapKey(CMD_S())+" IND_s="+CMD_S()\IND_s+" ind="+Str(CMD_S()\ind); +" NOM_EXE="+GetFilePart(info_wdn()\NOM_EXE)+" NOM_WND="+info_wdn()\NOM_WND+" Occurrence="+Str(info_wdn()\ind)
; Debug texte$+" res_f="+Str(res_f2)
texte2$="cle_R="+clef$+"clé="+MapKey(CMD_H())+" L_PP="+CMD_H()\L_PP+" ID="+CMD_H()\ID+" Bouton="+CMD_H()\BOUT+" L_MS="+CMD_H()\L_MS+" "+CMD_H()\INF
textex$=CMD_H()\L_PP+Chr(10)+CMD_H()\L_MS+Chr(10)+CMD_H()\BOUT+Chr(10)+CMD_H()\ID+Chr(10)+CMD_H()\INF
; Debug TEXTE$
AddGadgetItem(#ListIcon_11,0,textex$)
SetGadgetItemColor(#ListIcon_11, -1, #PB_Gadget_BackColor , RGB(245, 245, 220),0) ; [, Colonne])
SetGadgetItemColor(#ListIcon_11, -1, #PB_Gadget_BackColor , RGB(255, 255, 190),1) ; [, Colonne])
SetGadgetItemColor(#ListIcon_11, -1, #PB_Gadget_BackColor , RGB(255, 255, 90),2) ; [, Colonne])
; SetGadgetItemColor(#ListIcon_11, -1, #PB_Gadget_BackColor , RGB(230, 230, 250),3) ; [, Colonne])
SetGadgetItemColor(#ListIcon_11, -1, #PB_Gadget_BackColor , RGB(255, 217, 148),3) ; [, Colonne])
SetGadgetItemColor(#ListIcon_11, -1, #PB_Gadget_BackColor , RGB(255, 255, 0),4) ; [, Colonne])
Next
EndIf
EndProcedure
;***************************************** Détermine les caractéristiques de la calculatrice ********************************
Define ii,clef1$,Resultat1,clef2$,Resultat2,MESM$,MEsm2$,sort_run, L_PP.s, ID.s, BOUT.s, L_MS.s, INF.s,i,j,a$
Repeat ; Permet de vérifier si une intance de Calc.exe ou de CalcPlus.exe est en mémoire
ii+1
FIND_WINDOWS_INFOS(info_wdn(),"E"); Demande de toutes les clés des programmes EXEC en mémoire
clef1$="E1 calc.exe" ; respecter la case
Resultat1=FindMapElement(info_wdn(),clef1$)
If resultat1<>0
Define el1.inf_wnd=info_wdn()
EndIf
clef2$="E1 CalcPlus.exe" ; respecter la case
Resultat2=FindMapElement(info_wdn(),clef2$)
If resultat2<>0
Define el2.inf_wnd=info_wdn()
EndIf
If el1\ind>0 And el2\ind>0
MESM$=" calc.exe et CalcPlus.exe sont déjà en machine"
MEsm2$="Choisissez l'un en effacant l'autre"
NOM_EXE$=Trim(StringField(InputRequester(mesm$,mesm2$,"calc.exe / CalcPlus.exe"),1,"/"))
If Len(NOM_EXE$)>8
NOM_EXE$=el2\NOM_EXE
NOM_WND$=el2\nom_WND
Else
NOM_EXE$=el1\NOM_EXE
NOM_WND$=el1\nom_WND
EndIf
ElseIf el1\ind>0
NOM_EXE$=el1\NOM_EXE
NOM_WND$=el1\nom_WND
ElseIf el2\ind>0
NOM_EXE$=el2\NOM_EXE
NOM_WND$=el2\nom_WND
Else
sort_run=RunProgram(NOM_EXE$,"","",#PB_Program_Hide) ; On lance le programme
Delay(500) ; ***************************** valeur à ajuster en fonction de la machine ********************************
EndIf
Until Len(NOM_WND$)>0 Or II>5
;***************************************** Fin de (Détermine les caractéristiques de la calculatrice) ********************************
;******************************** chargement des tables de commandes et d'instructions ***********************************
Repeat
Read.s L_PP.s
Read.s ID.s
Read.s BOUT.s
Read.s L_MS.s
Read.s INF.s
If L_PP<>"FIN"
If Val(ID)<306 And Val(ID)>399
instr(L_PP)=Val(ID)
CMD_H(L_PP)\L_PP=L_PP:CMD_H(L_PP)\ID=ID
; CMD_S(L_PP)\IND_s=L_PP
FIND_COLL_H(L_PP,ID,BOUT,L_MS,CMD_S())
Else
If NOM_WND$="Calculatrice"
instr(L_PP)=Val(ID)
CMD_H(L_PP)\L_PP=L_PP:CMD_H(L_PP)\ID=ID
; cmd_s(L_PP)\IND_s=L_PP
FIND_COLL_H(L_PP,ID,BOUT,L_MS,CMD_S())
Else
instr(L_PP)=Val(ID)+1
CMD_H(L_PP)\L_PP=L_PP:CMD_H(L_PP)\ID=Str(Val(ID)+1)
; CMD_S(L_PP)\IND_s=L_PP
FIND_COLL_H(L_PP,ID,BOUT,L_MS,CMD_S())
If Val(ID)=306
L_PP="MCO":ID="306"
instr(L_PP)=Val(ID)
CMD_H(L_PP)\L_PP=L_PP:CMD_H(L_PP)\ID=ID
CMD_S(L_PP)\IND_s=L_PP
FIND_COLL_H(L_PP,ID,BOUT,L_MS,CMD_S())
EndIf
EndIf
EndIf
CMD_H()\L_MS=L_MS:CMD_H()\BOUT=BOUT:CMD_H()\INF=INF
EndIf
Until L_PP="FIN" And ID="FIN"
;************* POUR PROGRAMMER DES PAUSES de 1s jusqu'à 50 secondes
For j=1 To 50
a$="P"+Str(J)
instr(a$)=J
Next
;************* POUR PROGRAMMER Les instructions de I80 à I500 format [I80\I82...]
For I=80 To 500
a$="I"+Str(I)
instr(a$)=I
Next
;******************************** Fin de chargement des tables de commandes et d'instructions ***********************************
DisableExplicit
;********************************************************************************************************************************
;********************************************** Programme principal et boucle des événements **********************************
;********************************************************************************************************************************
OpenWindow_Window_0()
hmainWnd=GET_HWND_FROM_NOM_WND(NOM_WND$)
;***************************************** '# Activation du mode scientifique
WM_COMMANDE(hMainWnd,304); SendMessage_(hMainWnd,#WM_COMMAND,304,0) Passage de la calculatrice en mode scientifique
; OpenWindow_Window_0()
charge_combo()
SetForegroundWindow_(WindowID(#Window_0))
SetActiveWindow(#Window_0)
PATH_help$=GetEnvironmentVariable("windir")+"\help\"
path_dirc$=GetCurrentDirectory()
; Debug _s(path_dirc$)+_s(path_help$)
;{- Event loop
;******************** POUR LE TRI PAR COLONNE ******************************
updown=1
lastcol=0
UpdatelParam()
SetWindowCallback(@ColumnClickCallback())
;********************* FIN POUR LE TRI **************************************
Repeat
SetActiveWindow(#Window_0)
SetForegroundWindow_(WindowID(#Window_0))
Event=WaitWindowEvent()
EventGadget=EventGadget()
EventType=EventType()
eventmenu=EventMenu()
Select Event
Case #PB_Event_Menu
Select eventmenu
Case #menu_1
sort_Help=RunProgram(path_help$+"calc.chm","","") ; On lance le programme
Case #menu_2
; sort_Help=RunProgram(path_dirc$+"\AIDE_CALCULATRICE2.htm","","") ; On lance le programme
Case #help
sort_Help=RunProgram(path_help$+"calc.chm","","") ; On lance le programme
; sort_Help=RunProgram(path_dirc$+"\Help_Commandes_Calc.htm","","") ; On lance le programme
; sort_Help=RunProgram(path_dirc$+"A_rap.html","","") ; On lance le programme
EndSelect
; ///////////////////
Case #PB_Event_Gadget
EventGadget=EventGadget()
EventType=EventType()
Select EventGadget
Case #TEXT_GAD1
Case #TEXT_GAD2
Case #ComboBox_7
Option$=GetGadgetText(#ComboBox_7)
ClearGadgetItems(#ComboBox_8)
; Debug option$
i=0
ForEach CMD_H()
Select option$
Case "Option[xx]"
Choix_Comb8$=cmd_h()\L_PP
Case "Langage MS"
Choix_Comb8$=cmd_h()\L_MS
Case "Boutons"
Choix_Comb8$=cmd_h()\BOUT
Default
Choix_Comb8$=cmd_h()\BOUT
EndSelect
tab_ban(i)=Choix_Comb8$
i+1
Next
SortArray(tab_ban(),#PB_Sort_Ascending | #PB_Sort_NoCase)
For j=0 To i-1
If tab_ban(j)<>""
AddGadgetItem(#ComboBox_8,-1,tab_ban(j))
EndIf
Next
Case #ComboBox_8
Case #ComboBox_1
; Debug _n(event_gadget)+_n(event_type)
Case #ListView_2
Case #Button_8
Choix_AId$=Trim(GetGadgetText(#ComboBox_8))
If choix_Aid$="AIDE_Help" Or choix_Aid$=""
Charge_gadget9()
Else
Charge_gadget11(Choix_AId$)
EndIf
Case #ListIcon_9
Case #CheckBox_1
GET_HWND_FROM_NOM_WND(NOM_WND$)
;******************** MINIMISE LA CLACULETTE *****************************
; SendMessage_(hmainWnd,#WM_SYSCOMMAND,#SC_MINIMIZE,0)
; ;Options numCommand:
; ; 0 = #SC_MINIMIZE
; ; 1 = #SC_MAXIMIZE
; ; 2 = #SC_RESTORE
; ; 3 = #SC_CLOSE
If GetGadgetState(#CheckBox_1)=#PB_Checkbox_Checked
SendMessage_(hmainWnd,#WM_SYSCOMMAND,#SC_MINIMIZE,0)
Else
SendMessage_(hmainWnd,#WM_SYSCOMMAND,#SC_RESTORE,0)
EndIf
Case #Button_3
GET_HWND_FROM_NOM_WND(NOM_WND$)
; Texte$=GetGadgetText(#ComboBox_1)
; ************ Analyse du texte pour différencier langage Microsoft des Commandes directes avec CTRL_id (voir datasection)******
Texte$=StringField(GetGadgetText(#ComboBox_1),1,"$")
Max_el.l=ANALYSE_CM(Texte$,T_CM(),Instr())
For i=0 To Max_el
If T_CM(i)\E="M"
sortie$=EXE_WHND(hMainWnd,T_CM(i)\M)
; AddGadgetItem(#ListView_2,0,texte$+Chr(10)+sortie$)
; pause(2000)
ElseIf T_CM(i)\E="C"
; pause(1000)
Select t_cm(i)\c
Case 84
CHERCHE_STAT()
Case 304 To 305 ; MODE SCIENTIFIQUE STANDARD ET CONVERSION POUR la calculette microsoft Plus le Handle peut changer !!!!
SendMessage_(hmainWnd,#WM_SYSCOMMAND,#SC_RESTORE,0)
; ;Options numCommand:
; ; 0 = #SC_MINIMIZE
; ; 1 = #SC_MAXIMIZE
; ; 2 = #SC_RESTORE
; ; 3 = #SC_CLOSE
GET_HWND_FROM_NOM_WND(NOM_WND$)
FLAG_MOD_hWND=1
Case 306
If NOM_WND$="Calculatrice"
Else
SendMessage_(hmainWnd,#WM_SYSCOMMAND,#SC_RESTORE,0)
GET_HWND_FROM_NOM_WND(NOM_WND$)
FLAG_MOD_hWND=1
EndIf
Case 112 ; touche entrée ou = => demande de sortie
; pause(temp10)
AddGadgetItem(#ListView_2,0,texte$+Chr(10)+sortie$)
Default
EndSelect
Select t_cm(i)\c
Case 80 To 500
WM_COMMANDE(hMainWnd,t_cm(i)\c)
Case 1 To 79
ETAT_AV.l=GetGadgetState(#CheckBox_1)
SendMessage_(hmainWnd,#WM_SYSCOMMAND,#SC_RESTORE,0)
SetGadgetState(#CheckBox_1,#PB_Checkbox_Unchecked)
time.l=t_cm(i)\c
time*1000
Delay(time)
If ETAT_AV=#PB_Checkbox_Checked
SendMessage_(hmainWnd,#WM_SYSCOMMAND,#SC_MINIMIZE,0)
SetGadgetState(#CheckBox_1,#PB_Checkbox_Checked)
EndIf
EndSelect
EndIf
Next
AddGadgetItem(#ListView_2,0,texte$+Chr(10)+WM_COMMANDE(hMainWnd,300))
If FLAG_MOD_hWND=1
Delay(1000)
SendMessage_(hmainWnd,#WM_SYSCOMMAND,#SC_MINIMIZE,0)
FLAG_MOD_hWND=0
EndIf
; sortie$=EXE_WHND(hMainWnd,TEXTE$)
; AddGadgetItem(#ListView_2,0,texte$+Chr(10)+sortie$)
EndSelect ;***************ici
; ////////////////////////
Case #PB_Event_CloseWindow
EventWindow=EventWindow()
If EventWindow=#Window_0
retour=PostMessage_(hMainWnd,#WM_CLOSE,0,0) ; *************** Ferme la calculatrice calc.exe
CloseWindow(#Window_0)
End
EndIf
EndSelect
ForEver