Salve a tutti.
Ho la necessità di chiudere automaticamente da una form una determinata finestra di windows, aperta precedentemente con un comando utilizzando un campo testo dove ho la path, in maniera che se l'utente la dimentica aperta, alla fine non si ritrovi con una moltitudine di finestre windows aperte.
Ho cercato in rete ed ho trovato questo codice per Excel sul forum Microsoft il quale però chiude tutte le finestre Windows aperte, e questo non mi piace. L'indirizzo della discussione è questo:
https://answers.microsoft.com/it-it/msoffice/forum/all/chiudere-finestre-di-windows-tramite-vba/71ac8d74-d43e-4145-bc61-a46ec29fa972
Questo è il codice proposto per due soluzioni diverse che pare funzionino entrambe:
Per risolvere la tua domanda, in testa ad un modulo standard, prima di qualsiasi altra routine, incolla il seguente codice:
'=========>>
Option Explicit
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByRef lParam As Any) As Long
'--------->>
Private Declare Function FindWindow Lib "user32" _
Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Const SC_CLOSE = &HF060&
Private Const WM_SYSCOMMAND = &H112
Private Const EXPLORER_CLASSNAME As String = "CabinetWClass"
'--------->>
Public Sub Tester()
Dim iExplhwnd As Long
iExplhwnd = FindWindow(EXPLORER_CLASSNAME, vbNullString)
Do Until Not CBool(iExplhwnd)
SendMessage iExplhwnd, WM_SYSCOMMAND, SC_CLOSE, ByVal 0&
iExplhwnd = FindWindow(EXPLORER_CLASSNAME, vbNullString)
Loop
End Sub
'<<=========
Nelle mie prove ho voluto anche sostituire l'uso di WinExec con ShellExecute e, pertanto, il codice diventerebbe:
'=========>>
Option Explicit
Declare Function ShellExecute Lib "shell32.dll" Alias _
"ShellExecuteA" ( _
ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) _
As Long
'--------->>
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByRef lParam As Any) As Long
'--------->>
Private Declare Function FindWindow Lib "user32" _
Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Const SC_CLOSE = &HF060&
Private Const WM_SYSCOMMAND = &H112
Private Const EXPLORER_CLASSNAME As String = "CabinetWClass"
'--------->>
Public Sub Tester()
Dim iExplhwnd As Long
iExplhwnd = FindWindow(EXPLORER_CLASSNAME, vbNullString)
Do Until Not CBool(iExplhwnd)
SendMessage iExplhwnd, WM_SYSCOMMAND, SC_CLOSE, ByVal 0&
iExplhwnd = FindWindow(EXPLORER_CLASSNAME, vbNullString)
Loop
End Sub
'--------->>
Private Sub ApriArchivio()
'Apre Cartella PC
ShellExecute 0, "Open", "C:\Users\ndj\Documents\", 0, 0, 1
End Sub
'<<=========
È possibile utilizzarlo in qualche maniera su Access modificandolo per chiudere una specifica finestra di Windows, e se sì come?
Questa è roba parecchio complicata, quindi non mi chiedete di applicarmi più di così .
Grazie per un eventuale aiuto .
Alex66