время назад я задал этот вопрос, она была решена здесь:Установите состояние окна скрытого окна
Но теперь, и по неизвестным причинам, C# или Vb.Net код при условии, что он не работает, и я не понимаю, почему нет.
Я внес некоторые изменения в исходный код, предоставленный там, но я протестировал оригиналы и не работал.
Что происходит, так это то, что я не могу скрыть скрытый процесс, я не уверен, где я терплю неудачу. На первый взгляд я думаю, что дескриптор, который я получаю с FindWindowEx
, действительно не соответствует дескриптору, который я хочу.
Это мои P/инициировавшего вызов функции подписи и ShowWindow перечисление:
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto,
BestFitMapping:=False, ThrowOnUnmappablechar:=True)>
Friend Shared Function FindWindow(
ByVal lpClassName As String,
ByVal lpWindowName As String
) As IntPtr
End Function
<DllImport("User32.dll", SetLastError:=True, CharSet:=CharSet.Auto,
BestFitMapping:=False, ThrowOnUnmappablechar:=True)>
Friend Shared Function FindWindowEx(
ByVal hwndParent As IntPtr,
ByVal hwndChildAfter As IntPtr,
ByVal strClassName As String,
ByVal strWindowName As String
) As IntPtr
End Function
<DllImport("user32.dll")>
Friend Shared Function GetWindowThreadProcessId(
ByVal hWnd As IntPtr,
ByRef processId As Integer
) As Integer
End Function
<DllImport("User32", SetLastError:=False)>
Friend Shared Function ShowWindow(
ByVal hwnd As IntPtr,
ByVal nCmdShow As ProcessUtil.WindowState
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
Public Enum WindowState As Integer
Hide = 0
Normal = 1
ShowMinimized = 2
Maximize = 3
ShowMaximized = Maximize
ShowNoActivate = 4
Show = 5
Minimize = 6
ShowMinNoActive = 7
ShowNA = 8
Restore = 9
ShowDefault = 10
ForceMinimize = 11
End Enum
Функция:
Public Function SetWindowState(ByVal p As Process,
ByVal windowState As ProcessUtil.WindowState) As Boolean
Dim pHandle As IntPtr = IntPtr.Zero
Dim pid As Integer
' If window is visible then...
If (p.MainWindowHandle <> IntPtr.Zero) Then
Return ProcessUtil.NativeMethods.ShowWindow(p.MainWindowHandle, windowState)
Else ' window is hidden.
' Check all open windows (not only the process we are looking),
' begining from the child of the desktop.
While (pid <> p.Id)
' Get child handle of window who's handle is "pHandle".
pHandle = NativeMethods.FindWindowEx(IntPtr.Zero, pHandle, Nothing, Nothing)
' Get PID from "pHandle".
NativeMethods.GetWindowThreadProcessId(pHandle, pid)
End While
Return NativeMethods.ShowWindow(pHandle, windowState)
End If
End Function
И так, что я пытаюсь проверить функцию, где первый I скрыть окно процесса блокнота, затем я попытаюсь показать его.
Dim p As Process = Process.GetProcessesByName("notepad").First
ProcessUtil.SetWindowState(p, ProcessUtil.WindowState.Hide)
' I find again the process to renew the "p.MainWindowHandle" as IntPtr.Zero.
p = Process.GetProcessesByName("notepad").First
ProcessUtil.SetWindowState(p, ProcessUtil.WindowState.Restore)
Вы пробовали установить WindowState в Normal? – Nemo
@Nemo Спасибо за комментарий. Да, я пробовал каждое значение перечисления, но он не восстанавливает скрытое окно. Я сравнил результирующий дескриптор 'FindWindowEx' после цикла ** While ** заканчивается дескриптором, который дает мне приложение командной строки CMDOW, и он отличается (ну, CMDOW дает мне основной HWND), но тот же самый код работал время назад, я не понимаю, почему теперь это происходит. – ElektroStudios
@ElektroStudios Вы пытались использовать Process.GetProcessesByName («блокнот») и Process.MainWindowHandle? –