포 그라운드 프로세스 (또는 특정 프로세스)의 해당 시점에서 CPU 및 RAM 사용을 검색하고 싶습니다. 창 제목을 가져 오는 것이 문제가 아니며 해당 부분이 작동합니다. 그러나 활성 창이 70 % cpu 이상으로 실행중인 경우에도 cpu 디스플레이는 0 %로 유지됩니다.C# 특정 프로세스 (성능 카운터)에서 CPU 및 RAM 가져 오기
(int) pCPU.NextValue(); // < < < < 0 ...
참고 : 성능 카운터로 수행하고 싶습니다. Process 변수를 사용하여이를 수행하기를 원하지 않습니다. 왜냐하면 프로세스 변수가 '충분하지 않은 권한 오류'를 발생시킬 수 있기 때문입니다.
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);
[DllImport("user32.dll")]
public static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, out uint ProcessId);
public void GetActiveCPUAndRam(out string windowTitle, out int CPUUsagePerc, out int RAMUsage)
{
IntPtr hwnd = GetForegroundWindow();
uint pid;
GetWindowThreadProcessId(hwnd, out pid);
Process activeProc = Process.GetProcessById((int) pid);
#region Window Title
const int nChars = 256;
StringBuilder Buff = new StringBuilder(nChars);
if (GetWindowText(hwnd, Buff, nChars) > 0)
windowTitle = Buff.ToString();
else
{
windowTitle = "";
CPUUsagePerc = 0;
RAMUsage = 0;
return;
}
#endregion
#region RAM/CPU
PerformanceCounter pCPU = new PerformanceCounter("Process", "% Processor Time", activeProc.ProcessName, true);
pCPU.NextValue();
CPUUsagePerc = (int)pCPU.NextValue(); // <<<<< problem here.
RAMUsage = 0; // TODO:
#endregion
}
편집 : 나는 새로운 솔루션을 시도 : 하지만 100 % (싱글 코어)에 CPU 사용을 미는 CPU 스트레스 테스트 프로그램을 실행할 때. 그런 다음 아래의 솔루션은 해당 프로세스의 CPU 사용량이 전체 CPU의 300 ~ 400 %와 같은 것을 보여줍니다 ... 분명히 뭔가 잘못되었습니다.
private PerformanceCounter pCPU = null;
private IntPtr PreviousProcHwnd = IntPtr.Zero;
private CounterSample PreviousCPUCounterSample = CounterSample.Empty;
public void GetActiveCPUAndRam(out string windowTitle, out int CPUUsagePerc, out int RAMUsage)
{
...
#region RAM/CPU
if (PreviousProcHwnd != hwnd)
{
PreviousProcHwnd = hwnd;
pCPU = new PerformanceCounter("Process", "% Processor Time", activeProc.ProcessName,
true);
PreviousCPUCounterSample = CounterSample.Empty;
}
CounterSample sample1 = pCPU.NextSample();
CPUUsagePerc = (int)CounterSample.Calculate(PreviousCPUCounterSample, sample1);
PreviousCPUCounterSample = sample1;
RAMUsage = 0; // TODO:
#endregion
}
본 적이 있습니까? http://openhardwaremonitor.org/? –