cha*_*ian 12 c# automation process
我正在尝试编写一些自动化来打开一系列窗口(非隐藏,非恶意)并且我不希望它们在打开时窃取焦点.问题是当每个窗口打开时,它会窃取焦点,阻止我在后台运行时工作.这是我在循环中执行以打开各种窗口的代码:
using (Process proc = new Process())
{
proc.StartInfo.FileName = filename;
proc.StartInfo.Arguments = arguments;
proc.Start();
Thread.Sleep(1000);
if (!proc.HasExited)
{
proc.Kill();
}
}
Run Code Online (Sandbox Code Playgroud)
如何在没有焦点的情况下使这些打开,以便在自动化运行时我可以做其他事情?
附录:
执行上述代码的程序是一个简单的控制台应用程序.我开始的流程是GUI应用程序.出于测试/设计目的,我目前正在尝试使用iexplore.exe具有不同参数的Internet Explorer()的重复实例.
我会运行它并继续执行其他不相关的工作,而这在后台运行.我也不希望焦点返回到父应用程序.基本上,.exe当我到达我的办公桌时,我会运行它,并切换到其他窗口做其他工作,忽略原始程序及其子进程,直到它完成.
ben*_*rwb 10
这是可能的,但只能通过pinvoke,不幸的是需要大约70行代码:
[StructLayout(LayoutKind.Sequential)]
struct STARTUPINFO
{
public Int32 cb;
public string lpReserved;
public string lpDesktop;
public string lpTitle;
public Int32 dwX;
public Int32 dwY;
public Int32 dwXSize;
public Int32 dwYSize;
public Int32 dwXCountChars;
public Int32 dwYCountChars;
public Int32 dwFillAttribute;
public Int32 dwFlags;
public Int16 wShowWindow;
public Int16 cbReserved2;
public IntPtr lpReserved2;
public IntPtr hStdInput;
public IntPtr hStdOutput;
public IntPtr hStdError;
}
[StructLayout(LayoutKind.Sequential)]
internal struct PROCESS_INFORMATION
{
public IntPtr hProcess;
public IntPtr hThread;
public int dwProcessId;
public int dwThreadId;
}
[DllImport("kernel32.dll")]
static extern bool CreateProcess(
string lpApplicationName,
string lpCommandLine,
IntPtr lpProcessAttributes,
IntPtr lpThreadAttributes,
bool bInheritHandles,
uint dwCreationFlags,
IntPtr lpEnvironment,
string lpCurrentDirectory,
[In] ref STARTUPINFO lpStartupInfo,
out PROCESS_INFORMATION lpProcessInformation
);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool CloseHandle(IntPtr hObject);
const int STARTF_USESHOWWINDOW = 1;
const int SW_SHOWNOACTIVATE = 4;
const int SW_SHOWMINNOACTIVE = 7;
public static void StartProcessNoActivate(string cmdLine)
{
STARTUPINFO si = new STARTUPINFO();
si.cb = Marshal.SizeOf(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWMINNOACTIVE;
PROCESS_INFORMATION pi = new PROCESS_INFORMATION();
CreateProcess(null, cmdLine, IntPtr.Zero, IntPtr.Zero, true,
0, IntPtr.Zero, null, ref si, out pi);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
Run Code Online (Sandbox Code Playgroud)
设置si.wShowWindow为SW_SHOWNOACTIVATE正常显示窗口,但不会窃取焦点,并SW_SHOWMINNOACTIVE启动应用程序最小化,再次无需窃取焦点.
完整的选项列表可在此处获得:http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548(v = vs.85).aspx
解决了。
我最终使用的解决方案规避了任何属性或重新分配焦点。由于该任务是自动化且独立的,因此我仅使用 Windows 任务计划程序来运行该应用程序。无论出于何种原因,只要“父”控制台窗口未获得焦点,“子”GUI 窗口就会正常打开,但未获得焦点,从而允许我在应用程序运行时继续在另一个窗口中工作。
| 归档时间: |
|
| 查看次数: |
7853 次 |
| 最近记录: |