Я хочу получить эффективное значение осознания DPI для указанного идентификатора процесса в 64-разрядной версии Windows 10 Pro. Значение, которое мне нужно, является одним из PROCESS_DPI_AWARENESS, которое я могу получить с помощью функции WinAPI GetProcessDpiAwareness.Вызов GetProcessDpiAwareness из C# всегда возвращает ошибку E_INVALIDARG
Чтобы реализовать то, что мне нужно, я написал простое одно окно C# WPF-приложения в VS 2015. Я ввожу идентификатор процесса, который меня интересует в TextBox txtProcessID, и результат отображается в TextBlock txtResult, когда я нажимаю кнопка txtProcessID:
private const int S_OK = 0;
private enum PROCESS_DPI_AWARENESS
{
PROCESS_DPI_UNAWARE = 0,
PROCESS_SYSTEM_DPI_AWARE = 1,
PROCESS_PER_MONITOR_DPI_AWARE = 2
}
[DllImport("Shcore.dll")]
private static extern int GetProcessDpiAwareness(IntPtr hprocess, out PROCESS_DPI_AWARENESS value);
private void btnGetDPIAwareness_Click(object sender, RoutedEventArgs e)
{
int procIDint = int.Parse(txtProcessID.Text);
IntPtr procID = new IntPtr(procIDint);
PROCESS_DPI_AWARENESS value;
int res = GetProcessDpiAwareness(procID, out value);
if (res == S_OK)
txtResult.Text = value.ToString();
else
txtResult.Text = "Error: " + res.ToString("X");
}
Но вызов GetProcessDpiAwareness для любого процесса всегда дает мне ошибку E_INVALIDARG. Что я делаю не так?
[GetProcessDpiAwareness] (https://msdn.microsoft.com/en-us/library/windows/desktop/dn302113.aspx): * «hprocess: ** Обрабатывать ** процесса, который запрашивается». * - API ожидает дескриптор, тогда как вы вслепую передаете идентификатор. Чтобы получить дескриптор процесса из идентификатора процесса, вызовите [OpenProcess] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms684320.aspx), например. – IInspectable
https://msdn.microsoft.com/en-us/library/system.diagnostics.process.handle(v=vs.110).aspx –