C# 为什么CreateProcess忽略STARTUPINFO窗口大小值?
我正在尝试使用CreateProcess以特定的窗口大小启动记事本,以避免记事本在调整大小和移动之前出现在某个地方的瞬间出现闪烁 CreateProcess启动记事本,但CreateProcess和记事本都会忽略STARTUPINFO结构中的窗口维度。记事本以上次关闭时的正常大小显示在正常位置 我尝试的C# 为什么CreateProcess忽略STARTUPINFO窗口大小值?,c#,winapi,createprocess,C#,Winapi,Createprocess,我正在尝试使用CreateProcess以特定的窗口大小启动记事本,以避免记事本在调整大小和移动之前出现在某个地方的瞬间出现闪烁 CreateProcess启动记事本,但CreateProcess和记事本都会忽略STARTUPINFO结构中的窗口维度。记事本以上次关闭时的正常大小显示在正常位置 我尝试的dwFlags组合没有起作用。记事本要么根本不显示,要么忽略我的设置,并显示在操作系统确定的位置和大小 为什么CreateProcess会忽略我在STARTUPINFO中设置的值?我错过什么了吗
dwFlags
组合没有起作用。记事本要么根本不显示,要么忽略我的设置,并显示在操作系统确定的位置和大小
为什么CreateProcess会忽略我在STARTUPINFO中设置的值?我错过什么了吗
[TestMethod()]
public void CreateProcessTest() {
const uint NORMAL_PRIORITY_CLASS = 0x0020;
const uint STARTF_USESHOWWINDOW = 0x0001;
// create structures needed by CreateProcess
var pInfo = new Kernel32.PROCESS_INFORMATION();
var pSec = new Kernel32.SECURITY_ATTRIBUTES();
var tSec = new Kernel32.SECURITY_ATTRIBUTES();
pSec.nLength = Marshal.SizeOf(pSec);
tSec.nLength = Marshal.SizeOf(tSec);
// set the app and a file to open
var app = Environment.GetEnvironmentVariable("windir") + @"\notepad.exe";
var arguments = @" C:\somefile.txt";
// the started app window does not use these values
var sInfo = new Kernel32.STARTUPINFO();
sInfo.dwX = 800; // desired x-y position of the window
sInfo.dwY = 400;
sInfo.dwXSize = 200; // desired size of the window
sInfo.dwYSize = 400;
// no combination of these flags that I tried makes any difference
// Notepad always appears as normal and ignores the size settings above
sInfo.dwFlags = STARTF_USESHOWWINDOW;
sInfo.wShowWindow = (short) Win32.SW_SHOW;
// create the process
var result = Kernel32.CreateProcess(app, arguments,
ref pSec, ref tSec, false, NORMAL_PRIORITY_CLASS,
IntPtr.Zero, null, ref sInfo, out pInfo);
}
根据报告:
STARTUPINFO的dwFlags成员需要添加STARTF\u USEPOSITION和STARTF\u USESIZE
已编辑,存储在注册表目录:Computer\HKEY\u CURRENT\u USER\SOFTWARE\Microsoft\Notepad iWindowPosDX
iWindowPosDY
iWindowPosX
由于未正确设置
cb
成员,因此将忽略iWindowPosY您的整个
结构。我有点惊讶,CreateProcess
没有因为ERROR\u INVALID\u参数
而彻底失败
对于GUI进程,如果
CreateWindow
的nWidth
参数为CW\u usefault
,则仅当新进程第一次调用CreateWindow
来创建重叠窗口时,才会使用此选项-如果记事本不使用CW_USEDEFAULT怎么办?记事本会以上次关闭时的正常大小显示在正常位置。-这是关于记事本保存自我上次窗口大小和位置并使用它,但不要使用CW_UseDefault谢谢您的帮助。你是说记事本可以自行决定是否使用STARTUPINFO设置(可能不使用CW_USEDEFAULT,不管是什么)?换句话说,应用程序可以(也可能会)忽略startupinfo设置?当然。任何应用程序都可以调用CreateWindowEx,而不是在参数中使用CW_USEDEFAULT,而是在大小和参数中使用另一个值position@Kevin“换句话说,应用程序可以(也可能会)忽略startupinfo设置?”——没错,就是这样。STARTUPINFO
值只是一个建议,但应用程序可以自由地做任何他们想做的事情?您认为在此之后可以在子进程中覆盖CreateWindowEx的参数吗?@RbMb:行为良好的应用程序使用传递给它的位置,正如这个答案正确指出的,实际上没有传递任何位置。@RbMb:也是的,它会将应用程序提供的参数覆盖到ShowWindow。“对于GUI进程,第一次调用ShowWindow时,其nCmdShow参数被忽略”如果有帮助,我记得STARTF_USEPOSITION和STARTF_USESIZE是我尝试过的组合,但没有效果。记事本出现在正常的地方。我记得使用它们是因为我必须在网上查找它们的含义。@BenVoigt-是的,wShowWindow
如果使用了强制。但大小和位置-不是。问题是关于这一点。通常情况下,对于从第0天起就存在于结构中的字段,不会进行大小检查,因为它们“总是”在其中。在访问后来添加到结构中的字段时,只需检查大小。@Damien_异教者:这也是一项健全检查,以确保您没有将STARTUPINFOW
传递到CreateProcessA
,或将32位STARTUPINFOW
传递到64位CreateProcessW
。