C# setparent new cmd windows 10中的问题

C# setparent new cmd windows 10中的问题,c#,powershell,cmd,user32,setparent,C#,Powershell,Cmd,User32,Setparent,一段时间以来,我通过集成multi选项卡创建了一个控制台应用程序(cmd&powershell)。我正在使用user32的setparent功能。除移动父窗口外,所有操作都正常。无法访问子窗口。它是可见的,但不可能点击它。要解决此问题,必须将父窗口替换为原来的位置。我注意到这个“bug”只出现在新的Windows10控制台上 我不知道该怎么办 (对不起,我英语不好,我是法国人)我会尽量解释得更好。在某个位置启动子窗口,如果移动父窗口,子窗口将被禁用。像这样: 开始将父项设置为子项窗口。。。 移

一段时间以来,我通过集成multi选项卡创建了一个控制台应用程序(cmd&powershell)。我正在使用
user32
setparent
功能。除移动父窗口外,所有操作都正常。无法访问子窗口。它是可见的,但不可能点击它。要解决此问题,必须将父窗口替换为原来的位置。我注意到这个“bug”只出现在新的Windows10控制台上

我不知道该怎么办


(对不起,我英语不好,我是法国人)

我会尽量解释得更好。在某个位置启动子窗口,如果移动父窗口,子窗口将被禁用。像这样:

开始将父项设置为子项窗口。。。

移动父窗口。。

问题出现了

代码如下:

[DllImport("user32.dll")]
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);


[... Code ...]


Process process = new Process();
process.StartInfo.FileName = pProcess;
process.StartInfo.Arguments = pArgs;
process.EnableRaisingEvents = true;
process.Exited += new EventHandler((s, e) =>
{
    FermerOnglet(tabpage);
});

process.Start();
while (process.MainWindowHandle == (IntPtr)0)
{
}
SetParent(process.MainWindowHandle, metroPanel1.Handle);

我会尽量解释得更好。在某个位置启动子窗口,如果移动父窗口,子窗口将被禁用。像这样:

开始将父项设置为子项窗口。。。

移动父窗口。。

问题出现了

代码如下:

[DllImport("user32.dll")]
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);


[... Code ...]


Process process = new Process();
process.StartInfo.FileName = pProcess;
process.StartInfo.Arguments = pArgs;
process.EnableRaisingEvents = true;
process.Exited += new EventHandler((s, e) =>
{
    FermerOnglet(tabpage);
});

process.Start();
while (process.MainWindowHandle == (IntPtr)0)
{
}
SetParent(process.MainWindowHandle, metroPanel1.Handle);

我终于找到了解决办法,虽然没有那么复杂,但我不明白为什么会这样

解决方案:

[DllImport("user32.dll")]
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

[DllImport("user32.dll")]
static extern long SetWindowLongA(IntPtr hWnd, int nIndex, long dwNewLong);

[DllImport("User32.Dll")]
static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

[DllImport("user32.dll")]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

[DllImport("user32.dll")]
private static extern void RedrawWindow(IntPtr hWnd, IntPtr lprcUpdate, IntPtr hrgnUpdate, uint flags);

[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

[DllImport("user32.dll")]
static extern bool EnableWindow(IntPtr hWnd, bool bEnable);

[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);


[... Code ...]


Process process = new Process();
process.StartInfo.FileName = pProcess;
process.StartInfo.Arguments = pArgs;
process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
process.EnableRaisingEvents = true;
process.Exited += new EventHandler((s, e) =>
{
    FermerOnglet(tabpage);
});

process.Start();
while (process.MainWindowHandle == (IntPtr)0)
{
}
SetParent(process.MainWindowHandle, metroPanel1.Handle);
SetWindowLongA(process.MainWindowHandle, -16, 0x80000000L);


[... Code ...]


RedrawWindow(CurrentOngletSelect.HandleProcess.MainWindowHandle, (IntPtr)0, (IntPtr)0,  0x0400/*RDW_FRAME*/ | 0x0100/*RDW_UPDATENOW*/ | 0x0001/*RDW_INVALIDATE*/);
MoveWindow(CurrentOngletSelect.HandleProcess.MainWindowHandle, 0, 0, metroPanel1.Width, metroPanel1.Height, true);
SetWindowPos(CurrentOngletSelect.HandleProcess.MainWindowHandle, (IntPtr)(-1), 0, 0, 0, 0, 0);
ShowWindow(CurrentOngletSelect.HandleProcess.MainWindowHandle, 5);
EnableWindow(CurrentOngletSelect.HandleProcess.MainWindowHandle, true);

我终于找到了解决办法,虽然没有那么复杂,但我不明白为什么会这样

解决方案:

[DllImport("user32.dll")]
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

[DllImport("user32.dll")]
static extern long SetWindowLongA(IntPtr hWnd, int nIndex, long dwNewLong);

[DllImport("User32.Dll")]
static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

[DllImport("user32.dll")]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

[DllImport("user32.dll")]
private static extern void RedrawWindow(IntPtr hWnd, IntPtr lprcUpdate, IntPtr hrgnUpdate, uint flags);

[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

[DllImport("user32.dll")]
static extern bool EnableWindow(IntPtr hWnd, bool bEnable);

[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);


[... Code ...]


Process process = new Process();
process.StartInfo.FileName = pProcess;
process.StartInfo.Arguments = pArgs;
process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
process.EnableRaisingEvents = true;
process.Exited += new EventHandler((s, e) =>
{
    FermerOnglet(tabpage);
});

process.Start();
while (process.MainWindowHandle == (IntPtr)0)
{
}
SetParent(process.MainWindowHandle, metroPanel1.Handle);
SetWindowLongA(process.MainWindowHandle, -16, 0x80000000L);


[... Code ...]


RedrawWindow(CurrentOngletSelect.HandleProcess.MainWindowHandle, (IntPtr)0, (IntPtr)0,  0x0400/*RDW_FRAME*/ | 0x0100/*RDW_UPDATENOW*/ | 0x0001/*RDW_INVALIDATE*/);
MoveWindow(CurrentOngletSelect.HandleProcess.MainWindowHandle, 0, 0, metroPanel1.Width, metroPanel1.Height, true);
SetWindowPos(CurrentOngletSelect.HandleProcess.MainWindowHandle, (IntPtr)(-1), 0, 0, 0, 0, 0);
ShowWindow(CurrentOngletSelect.HandleProcess.MainWindowHandle, 5);
EnableWindow(CurrentOngletSelect.HandleProcess.MainWindowHandle, true);

请添加您的代码。重新安装窗户总是一个复杂的杂耍动作。我知道你的第一语言不是英语,但是你能不能再尝试一下“除了我移动父窗口,无法访问子窗口,它是可见的,但无法单击它”直到我看到一些代码之前都帮不上忙…我发布了一个带有我的代码和图片的回复以便更清晰请添加您的代码。重新安装窗户总是一个复杂的杂耍动作。我知道你的第一语言不是英语,但是你能不能再尝试一下“除了我移动父窗口,无法访问子窗口,它是可见的,但无法点击它”直到我看到一些代码,我会用我的代码和图片发布一个回复,以便更清晰