Obtaining User Input Delay per Process with C++

nalmsdn 21 Reputation points
2021-07-22T16:24:36.943+00:00

I am having trouble obtaining certain data from Windows Performance Counters with C++. I will preface my question by stating that I am new to both C++ and to developing for Windows, but I have spent some time on this issue already so I feel familiar with the concepts I am discussing here.

Question:

How do I use Windows PDH (Performance Data Helper) C++ to obtain Max Input Delay--either per session or per process? If I cannot use PDH to obtain this data, how do I obtain it?

Progress so far:

I have used this example to log some Performance Counters successfully, but the ones I want produce the error code 0xC0000BB8: "The specified object is not found on the system." This confuses me because I can access the objects--"User Input Delay per Process" or "User Input Delay per Session"--fine through perfmon. I even went as far as enabling the counter in the registry as outlined in the article I linked in my question, despite being on a build of Windows 10 that should have it enabled by default--Windows 10 Enterprise Build 19043. I had to make a small change to get the code to compile, but I have changed only the definition of COUNTER_PATH during my testing because, again, the code works as advertised except when it comes to the counter I want to access. Specifically:

Does not compile with Code C2440: 'initializing': cannot convert from 'const wchar_t [31]' to 'PWSTR':

CONST PWSTR COUNTER_PATH = L"\\Processor(0)\\% Processor Time";  

Does compile and log:

CONST wchar_t *COUNTER_PATH = L"\\Processor(0)\\% Processor Time";  

OR

CONST PWSTR COUNTER_PATH = const_cast<PWSTR>(TEXT( "\\Processor(0)\\% Processor Time" ));  

Compiles, but throws PDH error code 0xC0000BB8 at runtime (This is the Counter I want to access):

CONST PWSTR COUNTER_PATH = const_cast<PWSTR>(TEXT( "\\User Input Delay per Session(1)\\Max Input Delay" ));  

The hardcoded session ID of 1 in the string was for troubleshooting purposes, but wildcard (*) and 0 were also used with the same result. The counter path matches that shown in perfmon.

Essentially, all Performance Counters that I have attempted to access with this code--about 5 completely different ones--have successfully logged the data being requested, but the one I want to access continues to be evasive.

Update:
I manually rebuilt my performance counters, and now the User Input Delay per Process and User Input Delay per Session categories are absent from perfmon. I have already tried re-enabling it as outlined in the Max Input Delay article, but I still do not see it in perfmon. I am unsure if this is useful information for the topic at hand, but if anyone knows how to re-enable it, the help would be much appreciated regardless.

Windows development Windows API - Win32
Developer technologies C++
{count} votes

Accepted answer
  1. RLWA32 49,536 Reputation points
    2021-07-23T03:16:23.32+00:00

    In order to access either of the desired performance counters you must run the sample code with elevated privileges as an Administrator.

    1 person found this answer helpful.
    0 comments No comments

0 additional answers

Sort by: Most helpful

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.