Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Instance calculatrice

4 réponses
Avatar
Joël
Bonjour a tous,

sur une form(mdi) j'ouvre la calculatrice par mnuCalculatrice_Click()
par contre si on réduit celle-ci(barre de titre non visible) et qu'on
re-click sur mnuCalculatrice_Click()
sa ouvre une autre instance je lui ai donc rajouter
'If hWndApp <> 0 Then x = OpenIcon(hWndApp)'
pour ne pas re-ouvrir une autre instance de cette calculatrice et perdre le
résultat obtenu
sa fonctionne mais en cas de fermeture de la calculatrice comment
initialiser(hWndApp=0)
pour cette fois que sa ouvre bien une autre instance.
faut-il utiliser FindWindow ou y a t'il plus simple à faire...
jespere avoir bien expliquer le probleme ?

Joël

'
Private Sub mnuCalculatrice_Click()
On Error GoTo TraiteErreur
Dim x As Long
If hWndApp <> 0 Then ' hWndApp declarer dans form(Private hWndApp As
Long)
x = OpenIcon(hWndApp)
Exit Sub
End If
Screen.MousePointer = vbArrowHourglass
Dim hInst As Long
hInst = Shell(GetWindowsDir & "\Calc.exe", vbNormalFocus)
hWndApp = GetWinHandle(hInst)
SetParent hWndApp, Me.hWnd
Screen.MousePointer = vbDefault
Exit Sub
TraiteErreur:
Screen.MousePointer = vbDefault
MsgBox "La calculatrice est introuvable !!! Désolé...", vbCritical,
"Recherche Calculatrice Windows"
End Sub

4 réponses

Avatar
Jacques93
Bonjour Joël,
Joël a écrit :
Bonjour a tous,

sur une form(mdi) j'ouvre la calculatrice par mnuCalculatrice_Click()
par contre si on réduit celle-ci(barre de titre non visible) et qu'on
re-click sur mnuCalculatrice_Click()
sa ouvre une autre instance je lui ai donc rajouter
'If hWndApp <> 0 Then x = OpenIcon(hWndApp)'
pour ne pas re-ouvrir une autre instance de cette calculatrice et perdre le
résultat obtenu
sa fonctionne mais en cas de fermeture de la calculatrice comment
initialiser(hWndApp=0)
pour cette fois que sa ouvre bien une autre instance.
faut-il utiliser FindWindow ou y a t'il plus simple à faire...
jespere avoir bien expliquer le probleme ?

Joël




A mon avis, il serait plus logique de rattacher la calculette à la zone
MDI de ta fenêtre, et non pas à la fenêtre mère, ainsi on voit la
calculatrice réduite, et on peut la réactiver par le menu, ou sa barre
de titre. Par ailleurs sous W2K et XP, calc.exe se trouve par défaut
dans %windir%System32, d'où l'ajout de la recherche dans system32 :

Dim hWndApp As Long
Private Declare Function OpenIcon Lib "user32" _
(ByVal hwnd As Long) 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 FindWindow Lib "user32" Alias "FindWindowA"
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
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 IsIconic Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function GetSystemDirectory Lib "kernel32" Alias _
"GetSystemDirectoryA" (ByVal lpBuffer As String, _
ByVal nSize As Long) As Long


Private Sub mnuCalculatrice_Click()
On Error GoTo TraiteErreur

Dim x As Long
Dim hInst As Long
Dim hWndMDI As Long

If IsIconic(hWndApp) <> 0 Then
x = OpenIcon(hWndApp)
Exit Sub
End If

Screen.MousePointer = vbArrowHourglass
On Error Resume Next
hInst = Shell(GetWindowsDir & "Calc.exe", vbNormalFocus)
If Err.Number <> 0 Then
hInst = Shell(GetSystemWindowsDir & "Calc.exe", vbNormalFocus)
End If
On Error GoTo TraiteErreur
If hInst = 0 Then Err.Raise 53
hWndApp = GetWinHandle(hInst)
hWndMDI = FindWindowEx(Me.hwnd, 0&, "MDIClient", vbNullString)
SetParent hWndApp, hWndMDI
Screen.MousePointer = vbDefault
Exit Sub
TraiteErreur:
Screen.MousePointer = vbDefault
MsgBox "La calculatrice est introuvable !!! Désolé...", vbCritical, _
"Recherche Calculatrice Windows"
End Sub


Private Function GetSystemWindowsDir() As String
Dim s As String

s = Space(255)
GetSystemDirectory s, Len(s)
GetSystemWindowsDir = Left(s, InStr(s, Chr$(0)) - 1)
End Function

--
Cordialement,

Jacques.
Avatar
Jacques93
Jacques93 a écrit :
Bonjour Joël,



[...]

Et afin de ne pas laisser traîner d'instance invisible de la calculette
quand on ferme la MDIForm (tu le fais peut être déjà) :

Private Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Private Const WM_CLOSE = &H10

Private Sub MDIForm_Unload(Cancel As Integer)
If hWndApp <> 0 Then
SendMessage hWndApp, WM_CLOSE, 0&, 0&
End If
End Sub

--
Cordialement,

Jacques.
Avatar
Joël
Bonsoir Jacques
sa fonctionne parfaitement.
merci pour ton aide
Cordialement,
Joël

"Jacques93" a écrit dans le message de news:

Jacques93 a écrit :
Bonjour Joël,



[...]

Et afin de ne pas laisser traîner d'instance invisible de la calculette
quand on ferme la MDIForm (tu le fais peut être déjà) :

Private Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Private Const WM_CLOSE = &H10

Private Sub MDIForm_Unload(Cancel As Integer)
If hWndApp <> 0 Then
SendMessage hWndApp, WM_CLOSE, 0&, 0&
End If
End Sub

--
Cordialement,

Jacques.


Avatar
Jacques93
Joël a écrit :
Bonsoir Jacques
sa fonctionne parfaitement.
merci pour ton aide
Cordialement,
Joël




Merci du retour :-)

--
Cordialement,

Jacques.