gpt4 book ai didi

c# - 如何打开一个流程使其没有焦点?

转载 作者:可可西里 更新时间:2023-11-01 08:46:20 27 4
gpt4 key购买 nike

我正在尝试编写一些自动化程序来打开关闭一系列窗口(非隐藏、非恶意),我不希望它们在打开时窃取焦点。问题是,当每个窗口打开时,它会窃取焦点,阻止我在后台运行时工作。这是我在循环中执行以打开各种窗口的代码:

using (Process proc = new Process())
{
proc.StartInfo.FileName = filename;
proc.StartInfo.Arguments = arguments;
proc.Start();

Thread.Sleep(1000);

if (!proc.HasExited)
{
proc.Kill();
}
}

如何在没有焦点的情况下打开它们,以便我可以在此自动化运行时做其他事情?

附录:执行上述代码的程序是一个简单的控制台应用程序。我开始的进程是 GUI 应用程序。出于测试/设计目的,我目前正在尝试使用具有不同参数的 Internet Explorer (iexplore.exe) 的重复实例进行此操作。

当它在后台运行时,我将运行它并继续进行其他不相关的工作。我也不希望焦点返回到父应用程序。本质上,当我到达我的办公 table 时,我将运行这个 .exe,然后切换到其他窗口来做其他工作,忽略原始程序及其子进程,直到它完成。

最佳答案

这是可能的,但只能通过 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);
}

si.wShowWindow 设置为 SW_SHOWNOACTIVATE 以正常显示窗口但不会窃取焦点,并将 SW_SHOWMINNOACTIVE 设置为最小化启动应用程序,同样不会窃取焦点。

此处提供完整的选项列表:http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548(v=vs.85).aspx

关于c# - 如何打开一个流程使其没有焦点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12586957/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com