Passer word en priorité haute (SetPriorityClass)

Résolu
cs_Thibaut77 Messages postés 3 Date d'inscription samedi 5 septembre 2009 Statut Membre Dernière intervention 11 janvier 2014 - 27 juil. 2011 à 21:25
cs_Thibaut77 Messages postés 3 Date d'inscription samedi 5 septembre 2009 Statut Membre Dernière intervention 11 janvier 2014 - 28 juil. 2011 à 10:51
Bonjour à tous,

J'ai développé une petite appli qui au cours du déroulement rédige un rapport sous word. Pour des problèmes de performances, j'ai besoin de passer word en priorité haute.
Un jeu d'enfant me direz vous !
Eh ben pas pour moi ! j'ai épluché toutes les sources, forums et autres tuto de codes-sources et je n'y arrive pas?
Je développe sous VB express 2008 et le PC est sous XP SP3.
Je vous expose ci-dessous les 2 méthodes essayées. J'ai aussi tenté de donner les privilèges adéquats à mon appli (tout en bas) mais rien ne fonctionne.
J'ai essayé de modifier le paramètre d'accès (&H200 puis PROCESS_ALL_ACCESS, ? pour openprocess) et plein d'autres trucs mais rien n'y fait.
La boulette doit certainement être énorme mais je n'arrive pas à la voir.
HELP !
Merci !



1ere méthode : par WMI en recherchant le processus winword.exe (car je sais qu'il existe puisque créer par mon appli) :

Dim hProcess As Long
Dim objWMIService As Object
Dim sQuery As String
Dim oproc
Dim colItems As Collection
Dim valeur_priorite, res As Long
Const PROCESS_ALL_ACCESS = &H1F0FFF

objWMIService = GetObject("winmgmts:\\.\root\cimv2")
For Each oproc In objWMIService.Execquery("SELECT * FROM Win32_Process WHERE name= 'WINWORD.EXE'")
hProcess = OpenProcess(&H200, 0, oproc.processID) ' plante ici : hProcess=0 code erreur=87 => parametre incorrect
valeur_priorite = &H80
res = SetPriorityClass(hProcess, valeur_priorite)
Next



2éme méthode : par la fenêtre de word dont je connais le nom :

Dim handle_fen, handle_process, r, hproc_ouvert As Long
Const PROCESS_ALL_ACCESS = &H1F0FFF

handle_fen = FindWindow(vbNullString, "Document1 - Microsoft Word")

'A partir de ce handle de fenêtre, il est possible d'obtenir le handle du processus correspondant:
r = GetWindowThreadProcessId(handle_fen, handle_process) 'Plante ici : message d'erreur « tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée. »


' ouvre le processus en mode 'Interrogation et Définition', ce qui permettra d'obtenir le niveau de priorité du processus et de le changer:
hproc_ouvert = OpenProcess(&H200, False, handle_process)

'changer le niveau de priorité du processus pour le définir à "haute" (&H80):
r = SetPriorityClass(hproc_ouvert, &H80)

'L'opération étant terminée, il ne reste plus qu'à libérer le handle du processus ouvert.
CloseHandle(hproc_ouvert)




J'ai aussi tenté de donner les privilèges à mon appli qui pilote word :
(je vous passe les déclarations fastidieuses?)

'obtient le handle de ce process
hProc = GetCurrentProcess

'change les droits de cette application
OpenProcessToken(hProc, TOKEN_ALL_ACCESS, lhTokenHandle)
LookupPrivilegeValue(vbNullString, SE_DEBUG_NAME, tLuid) 'plante ici

'détermine le nombre de privileges à changer
tTokenPriv.PrivilegeCount = 1
tTokenPriv.TheLuid = tLuid
tTokenPriv.Attributes = SE_PRIVILEGE_ENABLED

'autorise le privilege SE_DEBUG_NAME
AdjustTokenPrivileges(lhTokenHandle, False, tTokenPriv, Len(tTokenPrivNew), tTokenPrivNew, lBufferNeeded)

3 réponses

Utilisateur anonyme
27 juil. 2011 à 21:46
Petite remarque :
Si word est dejà lancé :
Dim p() As Process = Process.GetProcesses
For Each item As Process In p
    If item.ProcessName = "WINWORD" Then
        item.PriorityClass = ProcessPriorityClass.High
        Exit For
    End If
Next

Bonne soirée.
5
Utilisateur anonyme
27 juil. 2011 à 21:36
Bonsoir,

As-tu essayé ceci ? :
Dim p As New Process
p.StartInfo.FileName = "WINWORD.exe"
p.Start()
p.PriorityClass = ProcessPriorityClass.High

Bonne soirée.
1
cs_Thibaut77 Messages postés 3 Date d'inscription samedi 5 septembre 2009 Statut Membre Dernière intervention 11 janvier 2014
28 juil. 2011 à 10:51
Ahhhh! du code comme j'aimerais en faire plus souvent...
Code court, simple, efficace, rapide et en prime qui fonctionne à merveille...
Merci banana32 !

Je n'ai testé que la version avec word déjà lancé puisque c'est mon cas.
Pour info, il ne faut pas rajouter l'extension du processus (".exe") sinon ca ne fonctionne pas!

Merci!
0
Rejoignez-nous