При выполнении моей программы я хочу скрыться/минимизировать Microsoft Speech Recognition Application:
сопроводительный текст http://img143.imageshack.us/img143/9380/minimize.png
и в конце я хочу показать/максимизировать использование c#!
Этот процесс не запускается мной так, я не могу дать контролю процесс startInfo.
Я попытался использовать методы user32.dll, такие как:
Со всеми ними у меня есть та же проблема.
Я могу скрыть окна (хотя я должен назвать один из методов два раза с опцией 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 имеет команду для уменьшения, это минимизирует и максимизирует это окно?
Весь набор функций SetForegroundWindow / ShowWindow работает только тогда, когда звезды выровнены! :) Обычно речь идет о вызове функций в правильном порядке. Извините, не могу конкретно помочь, но это может дать некоторые идеи
http://markribau.org/blog/2005/12/29/why-dont-focus-and-setforegroundwindow-work/
Выполняется ли процесс, если вы отправите ему сообщение SW_HIDE
? Приложение определенно не использует стандартный стиль графического интерфейса пользователя, поэтому оно может отреагировать на сообщение, закрыв себя.
В этом случае вы можете попробовать другие уловки, например, переместить окно в какое-нибудь невидимое место (например, -1000, -1000), что также должно быть возможно с помощью метода SetWindowPlacement
, который вы уже импортный.
Как сказал Томаш, вы должны попытаться использовать сообщения SW_HIDE и SW_SHOW.
Для этого нужно знать имя winwow Speech Recognition, а затем использовать что-то вроде этого:
HWND hc = FindWindow("processname","Windowtitle");
ShowWindow(hc,SW_HIDE);