Альтернатива GetWindowModuleFileName, чтобы получить другие процессы ApplicationFileName? - PullRequest
1 голос
/ 31 марта 2011

Чтобы получить имя приложения окна переднего плана (или имя файла приложения), я хочу использовать GetActiveWindow с GetWindowModuleFileName .

Я нашеланалогичный вопрос, относящийся к GetWindowText здесь

Эта реализация GetWindowText работает нормально, но GetWindowModuleFileName возвращает значение только для Visual Studio (когда я щелкаю внутри devenv) для всех других приложений, оно остается пустым.

Любой намек, как я могу узнать, что идет не так?Может ли это быть связано с разрешением / безопасностью моего приложения, запрашивающего имя файла приложения другого процесса?

РЕДАКТИРОВАТЬ: http://support.microsoft.com/?id=228469 похоже, что это не работает под Win> = XP

Любые альтернативы, как получить имя файла приложения?

Ответы [ 3 ]

1 голос
/ 01 апреля 2011

Чтобы получить имя приложения окна переднего плана (или имя файла приложения), я хочу использовать GetActiveWindow с GetWindowModuleFileName.

... запрос имени файла приложения другого процесса ...

На мой взгляд ваша проблема с использованием функции GetActiveWindow (). Он используется для сбора информации только из вызывающего потока / процесса. Если вызывающий поток неактивен, GetActiveWindow вернет 0;

Из MSDN:

GetActiveWindow Извлекает дескриптор окна для активного окна, прикрепленного к очереди сообщений вызывающего потока .

Попробуйте использовать функцию GetForegroundWindow () вместо GetActiveWindow ()

0 голосов
/ 31 марта 2011

Я нашел обходной путь, используя это:

[DllImport("user32.dll", SetLastError = true)]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

IntPtr handle = IntPtr.Zero;
handle = GetForegroundWindow();

uint processId;
if (GetWindowThreadProcessId(handle, out processId) > 0)
{
    Console.WriteLine(Process.GetProcessById((int)processId).MainModule.FileName);
}
0 голосов
/ 31 марта 2011

Случайно ли у вас отключено UAC? ​​

Начиная с Vista, если ваш код касается HWND в другом процессе, ваш процесс должен быть запущен с тем же уровнем привилегий.

Другими словами, если окно размещено в процессе, выполняемом от имени администратора, ваше приложение также должно запускаться от имени администратора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...