ShowWindowAsync () не показывает скрытое окно (SW_SHOW) - PullRequest
1 голос
/ 01 мая 2011

привет, я использую Visual Basic 2008

вот часть моего кода:

    Private Const SW_HIDE As Integer = 0
    Private Const SW_SHOW As Integer = 5

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
     Private Shared Function ShowWindowAsync(ByVal hwnd As IntPtr, ByVal nCmdShow As Integer) As Boolean
        End Function

button1 код:

            Try
               Dim p() As Process = Process.GetProcessesByName("notepad")
               Dim mwh = p(0).MainWindowHandle
               ShowWindowAsync(mwh, SW_HIDE)
            Catch ex As Exception
               MsgBox("error")
            End Try      

код button2:

            Try         
               Dim p() As Process = Process.GetProcessesByName("notepad")
               Dim mwh = p(0).MainWindowHandle
               ShowWindowAsync(mwh, SW_SHOW)
            Catch ex As Exception
               MsgBox("error")
            End Try  

, когда я нажимаю button 1 (чтобы скрыть окно), это работает хорошо, но потом, когда я хочу отобразить окно назад(нажав button 2) функция возвращает FALSE, кто может сказать мне, почему?и как заставить его работать, спрятать окно и затем показать его снова?

Ответы [ 4 ]

2 голосов
/ 01 мая 2011

Поскольку ShowWindowAsync() возвращает ноль, если окно было ранее скрыто согласно документации MSDN , а ноль интерпретируется как FALSE.Возвращаемое значение не указывает, была ли функция успешной или нет.

Таким образом, при первом вызове ShowWindowAsync(mwh, SW_HIDE) в видимом окне функция возвращает TRUE, поскольку ShowWindowAsync() возвращает ненулевое значение, указывающееокно (которое теперь / будет скрыто) раньше было видимым.

Тогда второй вызов ShowWindowAsync(mwh, SW_SHOW) в скрытом окне возвращает FALSE, потому что ShowWindowAsync() возвращает нулевое значение, указывающее окно (то естьтеперь / будет видимым) раньше был скрыт.

Другими словами, это сделано по задумке, и функция должна работать как задумано (если только окно mwh не отвечает на сообщения или не является недействительным).

Но настоящая проблема здесь в том, что когда вы прячете окно, свойство Process::MainWindowHandle больше не имеет дескриптора .

У процесса есть главныйОкно связывается с ним только в том случае, если процесс имеет графический интерфейс.Если связанный процесс не имеет главного окна, значение MainWindowHandle равно нулю. Это значение также равно нулю для процессов, которые были скрыты, то есть процессов, которые не видны на панели задач. Это может быть в случае процессов, которые отображаются в виде значков в области уведомлений, в крайнем правом углу.панели задач.

Что вам нужно сделать, это получить дескриптор окна с помощью p(0).MainWindowHandle один раз и сохранить возвращенный дескриптор где-нибудь, чтобы вы могли показать / скрыть окно.Конечно, вы должны убедиться, что вы обнулили сохраненный дескриптор, когда окно уничтожается целевым процессом.В случае Блокнота вы можете использовать событие Process::Exited .

1 голос
/ 22 мая 2014

Чтобы максимизировать скрытое окно другого процесса, вы должны сделать это 3 шага (очень легко):

1- Получить MainWindowHandle Поскольку приложение скрыто, MainWindowHandle равен 0 (false).Чтобы преодолеть эту проблему, вы можете использовать FindWindow

//Get the MainWindowHandle
IntPtr hwnd = FindWindow(null, <WINDOW TITLE>);

2 - Использовать ShowWindowAsync ()

bool result = ShowWindowAsync(hwnd, 3); //3= Maximize application

3 - Реализовать одно из событий этого приложения: "GotFocus", "Activated" или«IsVisibleChanged» (я проверял только событие «Активировано»)

private void WindowApplication_Activated(object sender, EventArgs e)
{
    Application.Current.MainWindow.Show();
}

Вы можете найти больше информации по этому URL: http://isolvable.blogspot.pt/2009/09/restoring-wpf-window-of-another-process.html

Надеюсь, эта информация может кому-то помочь!

1 голос
/ 15 мая 2011

При сокрытии я делал:

WindowHandle = Proc(0).MainWindowHandle
ShowWindowAsync(Proc(0).MainWindowHandle, ShowWindowConstants.SW_HIDE)

Затем при показе я использовал переменную WindowHandle:

ShowWindowAsync(WindowHandle, ShowWindowConstants.SW_SHOW)
1 голос
/ 01 мая 2011

звучит как "по замыслу".Не обрабатывайте возвращаемое значение «false» как ошибку.

Согласно MSDN:

If the window was previously visible, the return value is nonzero.

If the window was previously hidden, the return value is zero. 

http://msdn.microsoft.com/en-us/library/ms633549%28VS.85%29.aspx

Вероятно, вы можете заблокировать исключение изпроисходит путем объявления импорта функции взаимодействия как 32-разрядного целочисленного типа вместо логического.

Private Shared Function ShowWindowAsync(ByVal hwnd As IntPtr, ByVal nCmdShow As Integer) As Integer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...