Проблемы в setparent new cmd windows 10 - PullRequest
1 голос
/ 26 февраля 2020

В течение некоторого времени я создал консольное приложение (cmd & powershell), интегрировав мульти вкладку. Я использую setparent функцию user32. Все работает, кроме случаев, когда я перемещаю родительское окно. Невозможно получить доступ к дочернему окну. Это видно, но невозможно нажать на него. Чтобы исправить это, родительское окно должно быть заменено там, где оно было. Я заметил, что эта «ошибка» появляется только с новой консолью Windows 10.

Я не знаю, как это сделать.

(Извините за мой плохой Engli sh Я французский)

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Я наконец-то нашел решение, оно не было таким сложным, но я не понял, почему оно это сделало.

Решение:

[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);
0 голосов
/ 26 февраля 2020

Я постараюсь объяснить лучше. Я запускаю дочернее окно в позиции, если я перемещаю родительское окно, дочернее окно будет деактивировано. Например:

Начать установку родительского окна для дочернего окна ... enter image description here

Переместить родительское окно .. enter image description here

И проблема появляется ..

Вот код:

[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);
...