【发布时间】:2019-05-27 18:08:23
【问题描述】:
我正在尝试获取某些窗口句柄。我花了好几个小时寻找解决方案,我知道我的问题听起来与这个问题相似: FindWindow() doesn't find my window [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(我这样做了),但程序仍然可以选择忽略它。看起来这正是那里正在发生的事情。
但我试图通过 Spy++ 获取 exect 窗口句柄并尝试隐藏它 - 它有效,所以我可以从那里操作它并做我的事情。唯一的问题是找到它的句柄......
在这种情况下如何找到该句柄?
附言
- Windows 10 x64 Pro 乌克兰语(对于代码中的窗口标题不起作用的其他语言)
- .NET Framework 4.7.2
- 代码位于 .NET Framework 类库中,从 C# 控制台应用程序启动。
【问题讨论】:
-
在
process.Start();之后尝试process.WaitForInputIdle();。然后拨打IntPtr handle = FindWindow(null, "[The Windows Title in your language]");。我不认为你不能隐藏那个窗口。进程记得Dispose()。 -
另外,我认为(这里不确定)您应该在运行之前检查该进程是否已经处于活动状态。如果它已经在运行并且你再次运行它,你的应用程序可能会崩溃,除非你
try/catchprocess.Start();。您可以使用Process.GetProcessesByName("SystemPropertiesPerformance").First();来查看它是否处于活动状态。 -
你的程序启动后窗口是否隐藏?
-
First()我的意思当然是FirstOrDefault():) -
吉米,非常感谢。 )我没有检查其他答案,但
process.WaitForInputIdle();在process.Start();之后的简单行对我有用。我认为您应该将其添加为答案而不是评论。
标签: c# pinvoke window-handles