Я пытаюсь получить определенную ручку окна.Я искал решение в течение многих часов, и я понимаю, что мой вопрос звучит примерно так: FindWindow () не находит мое окно [C ++] Но это обсуждение не помогло.
Я пытался использовать как FindWindow (), так и FindWindowEx (), как эти два:
IntPtr SysPropWndHandler = FindWindow("#32770", "Параметри продуктивності");
IntPtr SysPropWndHandler = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "#32770", "Параметри продуктивності");
Странная часть в том, что когда я запускаю программу, она запускает новый процесс для определенных программных настроек системы из папки system32.и он не может найти свою ручку в то же время запуска (если это правильно, так сказать).Я попытался приостановить его, чтобы дать ему время создать окно и назначить дескриптор, но это не помогает.Но!Если эта системная программа запускается первой, а затем я запускаю свою программу, она сразу же находит ее ручку.Два способа для этого «внешнего запуска»:
- Я запускаю системную программу перед запуском своей программы
- Я запускаю свою программу, которая запускает эту системную программу, затем я закрываю свою программу,Системная программа не закрывается.После этого я снова запускаю свою программу.
Но на самом деле я пытаюсь заставить мою программу сделать следующее:
- запустить системную программу (некоторые настройки производительности)
- скрыть окно
- изменить некоторые настройки через WinApi (вид эмуляции щелчка флажка)
- щелкнуть ОК
- закрыть
Поскольку мой код работает, по крайней мере, в некоторых условиях, похоже, что он не имеет ничего общего с кодированием, о котором шла речь в том же вопросе.Иначе это не сработало бы вообще.
Я пытался запустить его скрытно, но это не сработало.Я попробовал тот же код для блокнота для его отладки - он работает.
string prog_path = @"C:\Windows\System32\SystemPropertiesPerformance.exe";
Process process = new Process();
process.StartInfo.FileName = prog_path;
process.StartInfo.CreateNoWindow = true; // no need for that, but I tried with it and without it just in case it works
process.StartInfo.UseShellExecute = true;
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.Start();
В соответствии с документацией Microsoft вам нужно установить UseShellExecute
на true
, чтобы использовать StartInfo.WindowStyle = ProcessWindowStyle.Hidden
(что я и сделал), но программа по-прежнему может игнорировать это.Похоже, это именно то, что там происходит.Но я попытался получить дескриптор окна Exect через Spy ++ и попытаться скрыть его - это работает, поэтому я могу манипулировать им оттуда и делать свое дело.Единственная проблема состоит в том, чтобы найти его дескриптор ...
Как мне найти этот дескриптор в этом случае?
PS
- Windows 10 x64 Pro украинский (длядругие языки, в которых заголовок окна в коде не будет работать)
- .NET Framework 4.7.2
- Код находится внутри библиотеки классов .NET Framework, которая запускается из консольного приложения C #.