V tomto provedení sice nepracuje se stále stejnou instancí, ale snaží se najít spuštěné okno, ale je-li spuštěno více instancí, bude potřeba nějak vybrat stejnou.
Nicméně proti původní ukázce vypadá, že funguje pro sedmičky i desítky a dokáže okno obnovit, je-li minimalizované :
API for 32bit :
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd 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 ShowWindow Lib "user32" _
(ByVal lhWnd As Long, _
ByVal lCmdShow As Long) As Boolean
Sub ShowCalculator()
Dim calculator As String: calculator = "Calculator"
Select Case Application.LanguageSettings.LanguageID(msoLanguageIDUI)
Case 1029, 1051
calculator = "Kalkulačka"
End Select
Dim lhWnd As Long
lhWnd = FindWindow("ApplicationFrameWindow", calculator) 'win10
If lhWnd = 0 Then
lhWnd = FindWindow("CalcFrame", calculator) 'win7
End If
If lhWnd = 0 Then
Shell "calc.exe", vbNormalFocus
Else
If IsIconic(lhWnd) Then
Const SW_RESTORE As Long = 9
ShowWindow lhWnd, SW_RESTORE
Else
SetForegroundWindow lhWnd
End If
End If
End Sub
Stačí přidat jako akci tlačítka v listu, rozbalovací nabídce či ribbonu a lze otestovat.citovat