C# 启动某些应用程序而不窃取焦点时出现问题

C# 启动某些应用程序而不窃取焦点时出现问题,c#,windows-10,C#,Windows 10,编辑:我相信我已经找到了一种解决方法,将Spotify作为Windows窗体的子对象,然后将Spotify与窗体一起启动,并在启动时将其作为子对象,然后当Spotify重新启动时,将其作为窗体的子对象,这就不那么暴力了。这对我来说没问题,但对其他人来说可能还不够 我一直在尝试启动一个程序(特别是Spotify),而不让它窃取对Windows10的关注。下面的代码是我得到的,我不完全理解它,因为它不是我的代码,但它似乎在一些程序上工作,但在其他程序上不工作。我也尝试过将焦点切换到先前打开的窗口,但

编辑:我相信我已经找到了一种解决方法,将Spotify作为Windows窗体的子对象,然后将Spotify与窗体一起启动,并在启动时将其作为子对象,然后当Spotify重新启动时,将其作为窗体的子对象,这就不那么暴力了。这对我来说没问题,但对其他人来说可能还不够

我一直在尝试启动一个程序(特别是Spotify),而不让它窃取对Windows10的关注。下面的代码是我得到的,我不完全理解它,因为它不是我的代码,但它似乎在一些程序上工作,但在其他程序上不工作。我也尝试过将焦点切换到先前打开的窗口,但这会中断全屏应用程序,并在一两秒钟内窃取焦点

我正在寻找一些其他的方法来打开一个程序,它不会窃取焦点,或者某种解决方法。主要是,我不想破坏全屏应用程序。我对C#比较陌生,所以请记住这一点。不确定这是否有用,但我正在WinForms应用程序上运行。也不确定这是否有帮助,但我的最终目标是重新启动Spotify,而不中断用户/用户焦点

[StructLayout(LayoutKind.Sequential)]
结构STARTUPINFO
{
公共Int32 cb;
保留公共字符串;
公共桌面;
公共名称;
公共Int32 dwX;
公共Int32 dwY;
公共Int32 dwXSize;
公共互联网;
公共Int32 dwXCountChars;
公共Int32 dwYCountChars;
公共Int32属性;
公共Int32 DWG标志;
公共Int16 wShowWindow;
公共信息16 CBReserved 2;
公共IntPtr lpReserved2;
公共IntPtr HST输入;
公共IntPtr HST输出;
公共IntPtr hStdError;
}
[StructLayout(LayoutKind.Sequential)]
内部结构进程信息
{
公共IntPtr hProcess;
公共IntPtr-hThread;
公共int-dwProcessId;
公共int-dwThreadId;
}
[DllImport(“kernel32.dll”)]
静态外部布尔创建过程(
字符串lpApplicationName,
字符串命令行,
IntPtr lpProcessAttributes,
IntPtr lpThreadAttributes,
布尔·宾赫里桑德斯,
uint dwCreationFlags,
IntPtr LPR环境,
字符串lpCurrentDirectory,
[In]参考STARTUPINFO和STARTUPINFO,
输出进程信息lpProcessInformation
);
[DllImport(“kernel32.dll”,SetLastError=true)]
[返回:Marshallas(UnmanagedType.Bool)]
静态外部布尔闭合手柄(IntPtr hObject);
常量int STARTF_USESHOWWINDOW=1;
const int SW_SHOWNOACTIVATE=4;
const int SW_showminoactive=7;
常数int SW_FORCEMINIMIZE=11;
公共静态void StartProcessNoActivate(字符串cmdLine)
{
STARTUPINFO si=新的STARTUPINFO();
si.cb=元帅SizeOf(si);
si.dwFlags=STARTF_USESHOWWINDOW;
si.wShowWindow=SW_showminoactive;
流程信息pi=新流程信息();
CreateProcess(null,cmdLine,IntPtr.Zero,IntPtr.Zero,true,
0,IntPtr.0,null,参考si,输出pi);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}

我有一个想法,我可以在windows窗体中运行程序。事实证明你可以。我将Spotify设置为Windows窗体的父级,通过将Spotify与窗体一起启动并在启动时将其设置为父级,当Spotify从窗体重新启动时,它将成为窗体的父级,而这似乎不会窃取焦点。这是我的密码。点击按钮是没有必要的,我只要在关闭Spotify后再次打开它就可以了。我不确定这是否适用于其他项目,但我想会的

编辑:这会让应用程序玩得更好,对于某些程序来说,它现在不会抢走焦点,但对于全屏应用程序来说,它似乎确实会把它们弄得一团糟。有时它会最小化它们,有时它根本不会弄乱它。不过,这并不像仅仅打开它那么暴力。老实说,我不知道为什么

公共部分类表单1:表单
{
私有void Form1\u加载(对象发送方、事件参数e)
{
尝试
{
ProcessStartInfo ps1=新的ProcessStartInfo(“C:/Users/Jacob/AppData/Roaming/Spotify/Spotify.exe”);
ps1.WindowStyle=ProcessWindowStyle.Minimized;
过程p1=过程启动(ps1);
Thread.Sleep(1000);//允许进程打开其窗口
appWin1=p1.MainWindowHandle;
//把它放在这个表格里
SetParent(appWin1,this.Handle);
//移动窗口以将其覆盖在此窗口上
移动窗口(appWin1,0,0,this.Width/2,this.Height,true);
}
捕获(例外情况除外)
{
MessageBox.Show(这个,例如消息“Error”);
}
}
公共表格1()
{
初始化组件();
}
[DllImport(“user32.dll”,SetLastError=true)]
私有静态外部long SetParent(IntPtr hWndChild、IntPtr hwndnnewparent);
[DllImport(“user32.dll”,SetLastError=true)]
专用静态外部长设置窗口位置(IntPtr hwnd、long hWndInsertAfter、long x、long y、long cx、long cy、long wFlags);
[DllImport(“user32.dll”,SetLastError=true)]
私有静态外部布尔移动窗口(IntPtr hwnd、intx、inty、intcx、intcy、布尔重绘);
IntPtr-appWin1;
私有无效按钮1\u单击(对象发送者,事件参数e)
{
睡眠(1000);
尝试
{
过程