Как скрыться/показать Процесс с помощью c#?

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

сопроводительный текст 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);

Примечание: API SAPI имеет команду для уменьшения, это минимизирует и максимизирует это окно?

6
задан aF. 13 June 2010 в 14:08
поделиться

3 ответа

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

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

1
ответ дан 17 December 2019 в 07:00
поделиться

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

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

1
ответ дан 17 December 2019 в 07:00
поделиться

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

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

HWND hc = FindWindow("processname","Windowtitle"); 
ShowWindow(hc,SW_HIDE);
2
ответ дан 17 December 2019 в 07:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: