Soyez le premier à donner votre avis sur cette source.
Vue 12 979 fois - Téléchargée 800 fois
Je vous met ici juste le code qui gèle le thread pour bien que vous voyez la simplicité de la chose : ' Retrouver une fenetre à partir de son titre Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long ' Retrouver le thread associé à la fenêtre Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long ' Suspend un thread Public Declare Function SuspendThread Lib "kernel32" (ByVal hThread As Long) As Long ' Reprend le thread arreté Public Declare Function ResumeThread Lib "kernel32" (ByVal hThread As Long) As Long ' Accéder au thread Public Declare Function OpenThread Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInherit As Long, ByVal dwThreadId As Long) As Long Public Const THREAD_ALL_ACCESS = &H1F03FF ' Suspendre un thread Public Function mtSuspendThread(ByVal ThreadID As Long) Dim hThread As Long ' Renvoie le handle du thread "ouvert" (pour agir dessus) hThread = OpenThread(THREAD_ALL_ACCESS, 0, ThreadID) ' Suspend le thread SuspendThread hThread ' Ferme le handle CloseHandle hThread End Function ' Reprendre un thread (qui est suspendu) Public Function mtResumeThread(ByVal ThreadID As Long) Dim hThread As Long ' Renvoie le handle du thread "ouvert" (pour agir dessus) hThread = OpenThread(THREAD_ALL_ACCESS, 0, ThreadID) ' Reprend le thread ResumeThread hThread ' Ferme le handle CloseHandle hThread End Function ' Extra : si vous voulez geler un processus, voici une fonction pour récupérer la liste des threads d'un processus. Il n'y a plus qu'à tous les geler Public Sub mtGetThreadListFromProcess(ByVal ProcessID As Long, ByRef tabThreadID() As Long, ByRef Compteur As Long) Dim hSnapshot As Long Dim Thread As THREADENTRY32 ReDim tabThreadID(0) As Long Compteur = 0 ' On crée une capture des threads du système hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, ProcessID) Thread.dwSize = Len(Thread) ' On prend le premier If Thread32First(hSnapshot, Thread) Then Thread.dwSize = Len(Thread) ' On parcourt tous les threads existants Do ' Si le thread a bien processId pour processus parent, on le liste If Thread.th32OwnerProcessID = ProcessID Then tabThreadID(Compteur) = Thread.th32ThreadID Compteur = Compteur + 1 ReDim Preserve tabThreadID(Compteur) As Long End If Loop While Thread32Next(hSnapshot, Thread) End If CloseHandle hSnapshot End Sub
Commentaires
en tout cas merci, ça peut etre utile.
Pour une application multi-thread (comme Word par exemple), comment se comporte ton programme ?
D'après les API utilisés, il semblerait que tu ne gèle que le thread de la fenêtre courante de l'application visé. Hors si d'autre thread on besoin d'interagir avec le thread de la fenêtre courante, que se passe-t-il ?
A creuser...
à la limite je testerai sous Word, mais le mieux pour geler un processus serait alors de geler tous les threads qui ont comme parent le processus visé non ?
Enfin au moins avec ça on sait geler un processus, depuis le temps que je cherchais c'était tout con, mais personne ne l'avais jamais mis sur vbfrance, c'est rare...
Et merci pour vos commentaires ;)
Sinon, vu qu'il y a des connaisseurs en threads, je vais en profiter pour demander une ptite chose ...^^
Je fait un client mail en ce moment, et quand le programme démarre, j'ai déja 4 threads, alors qu'il n'est pas volontairement multithreads. Ca viendrai des OCX externes que j'utilise dedans ? Et celon vous, si j'ai un control Winsock sur la form, d'index 9999, et que j'en charge 2 autres dynamiquement (le 0 et le 1), peuvent-il travailler undépendament l'un de l'autre avec 2 serveurs diffiférents "simultanément" (ceux d'index 0 et 1)? parce que, je sais pas si c'est une erreur de moi ou quoi, mais quand un recoi/envoi des données, aléatoirement, il s'arrete et laisse place à l'autre, il y a une sorte de parasitage.
Merci à ceux qui me répondront s'ils y en a ;-)
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.