【VB6・VBAメモ】WindowsAPI:SetPriorityClass関数 - プロセス優先度の設定 -

WindowsAPIのSetPriorityClass関数を使ったプロセス優先度の設定方法をメモしておきます。
複数のアプリケーションを同時に動作している場合に他アプリケーションとの影響を減らしたい場合に使える、かもしれないです。
※私はExcel2007以降でシステムが不安定になったのでExcelの処理安定化を期待して実装しました。。。(一応効果はあったと思います)

不可の高いアプリケーションのプロセス優先度を高やリアルタイムにした場合、
他のアプリケーションが応答しなくなってしまう恐れがあるので、なるべく使用はしない方がいいかと思います。
(高やリアルタイムにしてもシステムが格段に速くなるわけではありませんし)

概要
BOOL SetPriorityClass(HANDLE hProcess, DWORD dwPriorityClass)
機能 指定されたプロセスの優先度を設定
引数 hProcess プロセスのハンドル HANDLE
dwPriorityClass 優先度 DWORD(unsigned long)
戻り値 BOOL 成功時=0以外、失敗時=0
関連定数
定数名 説明
REALTIME_PRIORITY_CLASS 0x00000100 優先度:リアルタイム(管理者権限がない場合は高になる?)
HIGH_PRIORITY_CLASS 0x00000080 優先度:高
ABOVE_NORMAL_PRIORITY_CLASS 0x00008000 優先度:通常以上(Windows2000以降のみ)
NORMAL_PRIORITY_CLASS 0x00000020 優先度:通常
BELOW_NORMAL_PRIORITY_CLASS 0x00004000 優先度:通常以下(Windows2000以降のみ)
IDLE_PRIORITY_CLASS 0x00000040 優先度:低
定義例:プロセス優先度設定関数

MdlPriority.bas

WindowsAPI宣言

'プロセスID取得'
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
'プロセスオープン'
Private Declare Function OpenProcess Lib "kernel32" _
                  (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
'プロセスクローズ'
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
'優先度設定'
Private Declare Function SetPriorityClass Lib "kernel32" _
                  (ByVal hProcess As Long, ByVal dwPriorityClass As Long) As Long

'プロセスの情報設定のアクセス権を指定'
Private Const PROCESS_SET_INFORMATION     As Long = &H200&

'優先度:リアルタイム'
Public Const REALTIME_PRIORITY_CLASS     As Long = &H100&
'優先度:高'
Public Const HIGH_PRIORITY_CLASS         As Long = &H80&
'優先度:通常以上'
Public Const ABOVE_NORMAL_PRIORITY_CLASS As Long = &H8000&
'優先度:通常'
Public Const NORMAL_PRIORITY_CLASS       As Long = &H20&
'優先度:通常以下'
Public Const BELOW_NORMAL_PRIORITY_CLASS As Long = &H4000&
'優先度:低'
Public Const IDLE_PRIORITY_CLASS         As Long = &H40&

MdlPriority.bas

プロセス優先度設定関数

(ウィンドウハンドルからプロセスIDが取得できるので、そこからプロセスの優先度を変更する)

(FindWindow関数などで取得したウィンドウハンドルを指定してもOK)

'機能:指定したウィンドウハンドルのプロセスの優先度を変更'
'引数:hWnd    :ウィンドウハンドル'
'  :priority:優先度'
Public Sub SetPriority(ByVal hWnd As Long, ByVal priority As Long)
    Dim wID     As Long
    Dim wProc   As Long
    
    'プロセスID取得'
    Call GetWindowThreadProcessId(hWnd, wID)
    If wID > 0 Then
        'プロセスオープン'
        wProc = OpenProcess(PROCESS_SET_INFORMATION, 1, wID)
        '優先度を設定'
        Call SetPriorityClass(wProc, priority)
        'プロセスオープン'
        Call CloseHandle(wProc)
    End If
End Sub
使用例(1):VB6アプリケーションのプロセス優先度を高に設定

FormSample.frm

Public Sub Sample1()
    'VB6アプリケーションのプロセスの優先度を高に変更(フォームのウィンドウハンドルを指定)'
    Call SetPriority(FormSample.hWnd, HIGH_PRIORITY_CLASS)
End Sub
【実行前】 【実行後】
使用例(2):ExcelVBAでExcelプロセス優先度を低に設定

MdlSample.bas

Public Sub Sample2()
    'Excelプロセスの優先度を低に変更(Excelのウィンドウハンドルを指定)'
    Call SetPriority(Application.hWnd, IDLE_PRIORITY_CLASS)
End Sub
【実行前】 【実行後】
使用例(3):他アプリケーション(ここではメモ帳)の優先度を高に設定
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
                  (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Public Sub Sample3()
    'メモ帳のウィンドウハンドルを取得'
    Dim hWnd As Long
    hWnd = FindWindow("Notepad", vbNullString)
    
    If hWnd > 0 Then
        'メモ帳のプロセスの優先度を高に変更'
        Call SetPriority(hWnd, HIGH_PRIORITY_CLASS)
    End If
End Sub
【実行前】 【実行後】


コメント
コメントする








    
この記事のトラックバックURL
トラックバック
このページの先頭へ▲

search

カテゴリ

おすすめ書籍

楽天ブックス

フィロの村group

others

visiter