Как восстановить свернутое окно с помощью AppActivate (ProcessID) - PullRequest
3 голосов
/ 28 января 2010

Документация для состояний AppActivate (ProcessID) ...

Функция AppActivate изменяет фокус на указанное приложение или окно, но не влияет на то, развернуто оно или свернуто.

К сожалению, тогда он не советует, как вы МОЖЕТЕ свернуть приложение из панели задач, когда вы хотите его активировать.

Я не могу найти что-то вроде SetWindowState в объекте Process, поэтому, если у меня есть ProcessID и / или объект Process, что можно сделать, чтобы привести окно в нормальное или развернутое состояние?

Ответы [ 4 ]

4 голосов
/ 28 января 2010

Я не вижу ничего, кроме взаимодействия.

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
const UInt32 WM_SYSCOMMAND = 0x0112;
const UInt32 SC_RESTORE    = 0xF120;

if (Process.MainWindowHandle != IntPtr.Zero)
   SendMessage(Process.MainWindowHandle, WM_SYSCOMMAND, SC_RESTORE, 0);

Вы также можете использовать PostMessage, если вам не нужно знать, когда он был восстановлен.

0 голосов
/ 16 июля 2015

Я использовал SendMessage, чтобы вывести свое приложение на передний план. Хитрость в том, чтобы заставить эту работу все время работать, состоит в том, чтобы минимизировать, а затем восстановить. Таким образом, приложение мигает, но всегда восстанавливает правильное состояние окна, нормальное или развернутое.

SendMessage с P / Invoke

Private Function ActivateApp()
  AppActivate(System.Diagnostics.Process.GetCurrentProcess().Id)

  'Minimize Window
  SendMessage(System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle, 
    WM_SYSCOMMAND, SC_MINIMIZE, CType(0, IntPtr)

  'Restore Window
  SendMessage(System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle, 
    WM_SYSCOMMAND, SC_RESTORE, CType(0, IntPtr))
End Function

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As UInteger, ByVal lParam As IntPtr) As IntPtr
End Function

Const WM_SYSCOMMAND As UInt32 = &H112
Const SC_RESTORE As UInt32 = &HF120
Const SC_MAXIMIZE As UInt32 = &HF030
Const SC_MINIMIZE As UInt32 = &HF020
0 голосов
/ 27 сентября 2013

AppActivate(ProcessID)

SendKeys "{Enter}"

Это означает, что вы должны нажать клавишу ввода, чтобы активировать свернутый процесс

но в случае, если процесс не свернут, ключ ввода будет отправлен процессу и повлияет на процесс.

0 голосов
/ 31 января 2010

По неизвестным причинам представляется, что значение Process.MainWindowHandle, возвращаемое из приложения VB6, не является подходящим значением для передачи в ShowWindow для восстановления приложения из свернутого состояния.

В случае, когда заголовок приложения не является константным, вызов API FindWindow бесполезен. Этот код ниже предоставляет функцию, которая возвращает дескриптор работающему приложению на основе заголовка окна STARTING с указанным значением.

Пример использования: идентификация идентификаторов ...

Dim hwnd As Integer
Dim iProcessID As Integer

iProcessID = Shell("SampleApp.exe", AppWinStyle.NormalFocus)
hwnd = API.GetFirstWindowhandle("Sample App")

... восстановление приложения ...

AppActivate(iProcessID)

If API.IsMinimized(hwnd) Then
   API.ShowWindow(hwnd)
End If

... функциональные процедуры ...

Imports System.Runtime.InteropServices

Public Class API

   Private Declare Function apiGetTopWindow Lib "user32" Alias "GetTopWindow" (ByVal hwnd As Integer) As Integer
   Private Declare Function apiGetDesktopWindow Lib "user32" Alias "GetDesktopWindow" () As Integer
   Private Declare Function apiGetWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Integer, ByVal wCmd As Integer) As Integer
   Private Declare Function apiGetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Integer) As Integer
   Private Declare Function apiGetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Integer, ByVal lpString As String, ByVal cch As Integer) As Integer
   Private Declare Function apiShowWindow Lib "user32" Alias "ShowWindow" (ByVal hwnd As IntPtr, ByVal nCmdShow As Integer) As Integer
   Private Declare Function apiIsIconic Lib "user32" Alias "IsIconic" (ByVal hwnd As IntPtr) As Boolean

   Private Const GW_HWNDNEXT As Integer = 2
   Private Const SW_NORMAL As Integer = 1

   Public Shared Function GetFirstWindowHandle(ByVal sStartingWith As String) As Integer

      Dim hwnd As Integer
      Dim sWindowName As String

      Dim iHandle As Integer = 0

      hwnd = apiGetTopWindow(apiGetDesktopWindow)

      Do While hwnd <> 0
         sWindowName = zGetWindowName(hwnd)
         If sWindowName.StartsWith(sStartingWith) Then
            iHandle = hwnd
            Exit Do
         End If
         hwnd = apiGetWindow(hwnd, GW_HWNDNEXT)
      Loop

      Return iHandle

   End Function

   Public Shared Function IsMinimized(ByVal hwnd As Integer) As Boolean

      Dim ip As New IntPtr(hwnd)

      Return apiIsIconic(ip)

   End Function

   Public Shared Sub ShowWindow(ByVal hwnd As Integer)

      Dim ip As New IntPtr(hwnd)

      apiShowWindow(ip, SW_NORMAL)

   End Sub

   Private Shared Function zGetWindowName(ByVal hWnd As Integer) As String

      Dim nBufferLength As Integer
      Dim nTextLength As Integer
      Dim sName As String

      nBufferLength = apiGetWindowTextLength(hWnd) + 4
      sName = New String(" "c, nBufferLength)

      nTextLength = apiGetWindowText(hWnd, sName, nBufferLength)
      sName = sName.Substring(0, nTextLength) 

      Return sName

   End Function

End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...