【问题标题】:C# set foreground window from Console processC# 从控制台进程设置前景窗口
【发布时间】:2020-05-01 05:44:55
【问题描述】:

这适用于生成诸如notepad.exewinword.exewinver.exe 等进程的C# xUnit 测试项目。我需要在这些应用程序之间切换以进行测试(使它们成为前台窗口)。

到目前为止,我已经尝试了来自user32.dllSetForegroundWindowSwitchToThisWindowSetActiveSetFocus 等,但都不起作用。我试过使用 AttachThreadInput 技巧,但它似乎不起作用(也许我做错了?毕竟我是从控制台应用程序中使用它的)。我也试过press alt然后切换方法,但我不想这样做(记事本吃alt)。

【问题讨论】:

  • 强烈建议(特别是,因为您正在进行“测试”):查看 Selenium。例如:automatetheplanet.com/…
  • 声称该功能在完全按照文档中描述的方式工作时不起作用,这有点令人困惑。我强烈建议重新阅读docs.microsoft.com/en-us/windows/win32/api/winuser/… 并相应地调整您的期望。
  • 这取决于您忘记提及的操作系统。看过例子@pinvoke.net?
  • “我需要在这些应用程序之间切换以进行测试” - 您误诊了您的需求。您真正需要的是自动化一组应用程序。如果操作正确,这些应用程序都不需要符合用户输入的条件。毕竟,这是一个无需用户交互即可运行的自动化测试。正确行事涉及UI Automation。列出的所有应用程序都实现了 UI 自动化所需的接口。
  • 嗨,你的问题解决了吗?

标签: c# testing winapi console xunit


【解决方案1】:

我还没有解决这个问题,但我刚刚使用我自己的应用程序来测试不吃alt 密钥的应用程序。这是窗口切换代码,供参考(它在 F# 中使用 Vanara 库,但您可以更改一些内容以使其可用于 C#)。

let hwnd = mainWindowHWND
let keyState = Array.create 256 0uy

if User32.GetKeyboardState(keyState) && ((keyState.[VK_MENU |> int] &&& state) = 0uy) then
    User32.keybd_event(VK_MENU, 0uy, User32.KEYEVENTF.KEYEVENTF_EXTENDEDKEY, unativeint 0)

User32.SetForegroundWindow(hwnd()) |> ignore

if User32.GetKeyboardState(keyState) && ((keyState.[VK_MENU |> int] &&& state) = 0uy) then
    User32.keybd_event(VK_MENU, 0uy, User32.KEYEVENTF.KEYEVENTF_EXTENDEDKEY ||| User32.KEYEVENTF.KEYEVENTF_KEYUP, unativeint 0)

【讨论】:

    猜你喜欢
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2010-09-17
    • 2019-01-18
    • 2011-03-23
    • 2015-10-04
    • 1970-01-01
    相关资源
    最近更新 更多