Ho sviluppato un piccolo exe che controlla i programmi aperti su un pc in modo da intercettare quelli che per qualche ragione si sono bloccati.
Cercavo un sistema per simulare il tasto Ctrl + ALt + Canc ed effettuare il termina applicazione in modo tale da essere sicuro che il programma venga chiuso qualunque sia il suo stato.
Ho trovato un piccolo esempio di vb con funzioni API che intercetta i fogli Excel ma il programma fallisce se sul foglio Excel è stata apportata una modifica (in quanto si pare la finestra per salvare il file) oppure se il foglio Excel ha qualche finestra aperta (Stampa, Salva, etc).
Sicuramente è possibile forzare la chiusura ma non so proprio come fare: chi mi può aiutare?!?!
Allego il codice che ho utilizzato
'Dichiarazione funzioni
Private Const WM_CLOSE = &H10
Private Const INFINITE = &HFFFFFFFF
Private Declare Function apiPostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function apiFindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function apiWaitForSingleObject Lib "kernel32" Alias "WaitForSingleObject" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function apiIsWindow Lib "user32" Alias "IsWindow" (ByVal hWnd As Long) As Long
Private Declare Function apiGetWindowThreadProcessId Lib "user32" Alias "GetWindowThreadProcessId" (ByVal hWnd As Long, lpdwProcessID As Long) As Long
'SUB di chiusura
Dim lngRet As Long, hWnd As Long, pID As Long
hWnd = apiFindWindow("XLMAIN", vbNullString)
If (hWnd) Then
lngRet = apiPostMessage(hWnd, WM_CLOSE, 0&, ByVal 0&)
Call apiGetWindowThreadProcessId(hWnd, pID)
Call apiWaitForSingleObject(pID, INFINITE)
fCloseApp = Not (apiIsWindow(hWnd) = 0)
End If

Rispondi quotando


