2010-06-13 4 views
6

При выполнении моей программы, я хочу, чтобы скрыть/минимизировать Microsoft Speech Recognition Применение:Как скрыть/показать процесс с помощью C#?

alt text http://img143.imageshack.us/img143/9380/minimize.png

и в конце концов, я хочу, чтобы показать/максимально используя C#!

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

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

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

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

я могу скрыть окна (Althought я должен назвать один из методов два раза с опцией 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 имеет команду, чтобы минимизировать это минимизировать и максимизировать это окно?

ответ

1

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

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

+0

Я забыл mension, что один. Я также использовал это! –

+0

обновлено. – hawk

1

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

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

+0

Да, он все еще работает! –

2

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

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

HWND hc = FindWindow("processname","Windowtitle"); 
ShowWindow(hc,SW_HIDE); 
+0

Как я могу открыть заголовок окна? –

+0

Простой способ загрузки Windows TaskMonitor и увидеть его там. Посмотрите на это два: http://msdn.microsoft.com/en-us/library/ms633499%28VS.85%29.aspx http://www.recursosvisualbasic.com.ar/htm /listado-api/88-hwnd-class-name-parent.htm –

Смежные вопросы