プロが教えるわが家の防犯対策術!

 WinXp上で動くVB6SP5/ACCESS2002/Excel2002で構成したシステムをメンテ中です。
VBからACCESSデータを読込み編集後、Excel貼り付けて印刷しています。IOが多い事も原因ですがExcelが利用するCPU使用率が高く、他のアプリケーションの動作を圧迫している模様です。(他が本当に使っていたのかは確認しきれなかったのですが…)
No262230でExcelのCPU使用率の下げ方(優先度を下げる)を見つけたの、事前にExcelを立ち上げてから該当システムを実行してみました。すると別にExcelを起動してしまっており、この方法そのままでは有効ではありませんでした。
 どなたか、VBから呼び出し先のアプリケーションのCPU使用率を抑える、又は優先度を下げる方法を教えて下さい。

A 回答 (2件)

これでいかがでしょうか?



Dim hWnd As Long
Dim dwProcessId As Long
Dim hProcess As Long

hWnd = FindWindow("XLMAIN", vbNullString)
GetWindowThreadProcessId hWnd, dwProcessId

'取得
'hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, dwProcessId)
'Debug.Print Hex$(GetPriorityClass(hProcess))
'CloseHandle hProcess

'設定
hProcess = OpenProcess(PROCESS_SET_INFORMATION, False, dwProcessId)
Debug.Print SetPriorityClass(hProcess, IDLE_PRIORITY_CLASS)
CloseHandle hProcess

ウィンドウを探すことができれば、タスクマネージャから、優先度の設定を行ったことと同じことになると思います。

この回答への補足

回答有難うございます。

手順として
1.FindWindow行で該当のウインドウを探し
2.GetWindowTreadProcessID行でIDを取得後、
3.OpenProcess行で優先度を設定
4.プロセスを開放     …でしょうか。

すいません、一応調べてみたのですが定義した変数に収まる値の正確な内容とりうる範囲が良くわからないです(汗)

また、APIの命令が入っている様に思うのですが、これは事前に宣言は不要でしょうか。

補足日時:2003/12/10 11:19
    • good
    • 0

手順はいいと思います。


各宣言については、以下を参考にして下さい。
具体的な動作は、APIのヘルプなどの資料を参照して下さい。
あと、APIを使用していますので、強制終了されないように、エラーを処理してください。
(前回の回答はエラー処理を省いていましたので、、、)

またわからないことがあればまた補足して下さい。


Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

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 Const PROCESS_SET_INFORMATION = &H200
Private Const PROCESS_QUERY_INFORMATION = &H400

Private Declare Function GetPriorityClass Lib "kernel32" _
(ByVal hProcess As Long) As Long

Private Declare Function SetPriorityClass Lib "kernel32" _
(ByVal hProcess As Long, _
ByVal dwPriorityClass As Long) As Long

Private Const NORMAL_PRIORITY_CLASS = &H20
Private Const IDLE_PRIORITY_CLASS = &H40
Private Const HIGH_PRIORITY_CLASS = &H80
Private Const REALTIME_PRIORITY_CLASS = &H100
    • good
    • 0
この回答へのお礼

 御礼が遅くなり申し訳有りません。
これ以外の作業との絡みで未だ組み込めてはいないのですが、大変参考になりました。
この正月休みにでも組み込みに挑戦してみます。
有難うございました。

お礼日時:2003/12/25 09:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!