Как скрыть / показать процесс с помощью c #? - PullRequest
6 голосов
/ 13 июня 2010

Во время выполнения моей программы я хочу скрыть / свернуть приложение распознавания речи Microsoft:

альтернативный текст http://img143.imageshack.us/img143/9380/minimize.png

и в конце я хочу показать / развернуть, используя c #!

Этот процесс не запущен мной, поэтому я не могу дать контроль над процессом startInfo.

Я пытался использовать методы user32.dll, такие как:

  1. ShowWindow
  2. AnimatedWindows
  3. AnimatedWindows
  4. SetForegroundWindow
  5. SetWindowPos

Со всеми из них у меня та же проблема.

Я могу скрыть окна (хотя мне приходится вызывать один из методов два раза с опцией SW_HIDE), но когда я вызываю метод с флагом SW_SHOW, он просто не показывает ..

Как я могу развернуть / показать после сокрытия процесса?

Заранее спасибо!

Вот некоторые фрагменты кода, теперь реализованные для использования SetWindowPlacement:

{
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);
    [DllImport("user32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SetWindowPlacement(IntPtr hWnd,
       [In] ref WINDOWPLACEMENT lpwndpl);
    [DllImport("user32.dll")]
    public static extern Boolean ShowWindowAsync(IntPtr hWnd, Int32 nCmdShow);
    [DllImport("user32.dll")]
    public static extern Boolean SetForegroundWindow(IntPtr hWnd);        
    [DllImport("user32.dll")]
    public static extern Boolean ShowWindow(IntPtr hWnd, Int32 nCmdShow);
    [DllImport("user32.dll")]
    public static extern Boolean AnimateWindow(IntPtr hWnd, uint dwTime, uint dwFlags);
    [DllImport("dwmapi.dll")]
    public static extern int DwmSetWindowAttribute(IntPtr hwnd, uint dwAttribute, IntPtr pvAttribute, IntPtr lol);
//Definitions For Different Window Placement Constants
const UInt32 SW_HIDE = 0;
const UInt32 SW_SHOWNORMAL = 1;
const UInt32 SW_NORMAL = 1;
const UInt32 SW_SHOWMINIMIZED = 2;
const UInt32 SW_SHOWMAXIMIZED = 3;
const UInt32 SW_MAXIMIZE = 3;
const UInt32 SW_SHOWNOACTIVATE = 4;
const UInt32 SW_SHOW = 5;
const UInt32 SW_MINIMIZE = 6;
const UInt32 SW_SHOWMINNOACTIVE = 7;
const UInt32 SW_SHOWNA = 8;
const UInt32 SW_RESTORE = 9;

public sealed class AnimateWindowFlags
{
    public const int AW_HOR_POSITIVE = 0x00000001;
    public const int AW_HOR_NEGATIVE = 0x00000002;
    public const int AW_VER_POSITIVE = 0x00000004;
    public const int AW_VER_NEGATIVE = 0x00000008;
    public const int AW_CENTER = 0x00000010;
    public const int AW_HIDE = 0x00010000;
    public const int AW_ACTIVATE = 0x00020000;
    public const int AW_SLIDE = 0x00040000;
    public const int AW_BLEND = 0x00080000;
}

public struct WINDOWPLACEMENT
{
    public int length;
    public int flags;
    public int showCmd;
    public System.Drawing.Point ptMinPosition;
    public System.Drawing.Point ptMaxPosition;
    public System.Drawing.Rectangle rcNormalPosition;
}


            //this works

            param = new WINDOWPLACEMENT();
            param.length = Marshal.SizeOf(typeof(WINDOWPLACEMENT));
            param.showCmd = (int)SW_HIDE;
            lol = SetWindowPlacement(theprocess.MainWindowHandle, ref param);


            // this doesn't work

            WINDOWPLACEMENT param = new WINDOWPLACEMENT();
            param.length = Marshal.SizeOf(typeof(WINDOWPLACEMENT));
            param.showCmd = SW_SHOW;
            lol = GetWindowPlacement(theprocess.MainWindowHandle, ref param);

ПРИМЕЧАНИЕ. Имеется ли в SAPI API команда для минимизации этогоувеличить это окно?

Ответы [ 3 ]

2 голосов
/ 14 июня 2010

Как сказал Томас, вы должны попытаться использовать сообщения SW_HIDE и SW_SHOW.

Вы делаете это, зная имя winwow распознавания речи и затем используя что-то вроде этого:

HWND hc = FindWindow("processname","Windowtitle"); 
ShowWindow(hc,SW_HIDE);
1 голос
/ 13 июня 2010

Procoess все еще работает, если вы отправите ему сообщение SW_HIDE?Приложение, конечно, не использует стандартный стиль GUI, поэтому оно может реагировать на сообщение, закрыв себя.

Если это так, вы можете попробовать другие приемы, такие как перемещение окна в невидимое место (например, -1000, -1000), что также должно быть возможно с использованием метода SetWindowPlacement, который вы уже импортировали..

1 голос
/ 13 июня 2010

Весь набор функций SetForegroundWindow / ShowWindow работает только при выравнивании звезд! :) Обычно это вопрос вызова функций в правильном порядке. Извините, не могу помочь конкретно, но это может дать некоторые идеи

http://markribau.org/blog/2005/12/29/why-dont-focus-and-setforegroundwindow-work/

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