2017-01-07 35 views
0

キーボードで入力されたキーを常に聴く(最小化モードで常に実行される)アプリケーションがあります。 特定のキーが押されると、C#アプリケーションがアクティブウィンドウのメッセージキューにコマンドを投稿して、最小化、閉じる、最大化などを行うようにします。 アクティブなウィンドウにハンドルを取得することは可能ですが、メッセージキューにメッセージを投稿するにはどうすればいいですか(Win32で行うことができます)。おかげさまで C#アプリケーションからのアクティブなウィンドウ/アプリケーションへのメッセージの投稿

+1

ポストあなたはあなたのWin32プロシージャを呼び出す能力を与えるのPInvokeを見て、取るべきであるのPostMessage –

+1

使用してメッセージとして必要なヘルパーメソッドと列挙型です。 [msdn](https://msdn.microsoft.com/en-us/library/aa288468%28v=vs.71%29.aspx?f=255&MSPPError=-2147217396)と[PInvoke](http:// www。 pinvoke.net/) –

+0

DavidとJeroenに感謝します。 –

答えて

1

interopを使用して、ネイティブWINAPI関数を呼び出すことができます。私は次の解決方法作成したp/invokeウェブサイトの使用:私は基本的にここで何

var proc = Process.GetProcesses().First(p => p.ProcessName.Contains("firefox")); 

PostMessageSafe(
    new HandleRef(proc, proc.MainWindowHandle), 
    (uint) WM.WM_SYSCOMMAND, 
    new IntPtr((int) SysCommands.SC_MAXIMIZE), 
    IntPtr.Zero); 

することで、私が興味を持ってるし、その後メッセージにWM_SYSCOMMANDでのPostMessageを呼び出しWindowHandleとのwParamで適切なsyscommandを見つけることですこの場合、値0xF030で最大化します。

:lParamには0

に設定されているあなたの唯一の目標は、あなたがより良いものに特化したAPIエンドポイントを使用して、ウィンドウの状態を変更する場合、それはShowWindow

そのsignatureはこのようになりますと呼ばれていますのでご注意ください

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool ShowWindow(IntPtr hWnd, ShowWindowCommands nCmdShow); 

、それは次のように呼び出されます。これらのメソッドのいずれかが呼び出され

ShowWindow(proc.MainWindowHandle, ShowWindowCommands.Maximize); 

、ウィンドウFR omという名前のプロセスが最大化されます。

は、ここでは、ラッパーの周りPostMessage

[return: MarshalAs(UnmanagedType.Bool)] 
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
static extern bool PostMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 

// http://www.pinvoke.net/default.aspx/Enums/WindowsMessages.html 
public enum WM : uint 
{ 
    WM_SYSCOMMAND = 0x0112 
} 

// http://www.pinvoke.net/default.aspx/Enums/SysCommands.html 
enum SysCommands : int 
{ 
    SC_SIZE = 0xF000, 
    SC_MOVE = 0xF010, 
    SC_MINIMIZE = 0xF020, 
    SC_MAXIMIZE = 0xF030, 
    SC_NEXTWINDOW = 0xF040, 
    SC_PREVWINDOW = 0xF050, 
    SC_CLOSE = 0xF060, 
    SC_VSCROLL = 0xF070, 
    SC_HSCROLL = 0xF080, 
    SC_MOUSEMENU = 0xF090, 
    SC_KEYMENU = 0xF100, 
    SC_ARRANGE = 0xF110, 
    SC_RESTORE = 0xF120, 
    SC_TASKLIST = 0xF130, 
    SC_SCREENSAVE = 0xF140, 
    SC_HOTKEY = 0xF150, 
    //#if(WINVER >= 0x0400) //Win95 
    SC_DEFAULT = 0xF160, 
    SC_MONITORPOWER = 0xF170, 
    SC_CONTEXTHELP = 0xF180, 
    SC_SEPARATOR = 0xF00F, 
    //#endif /* WINVER >= 0x0400 */ 

    //#if(WINVER >= 0x0600) //Vista 
    SCF_ISSECURE = 0x00000001, 
    //#endif /* WINVER >= 0x0600 */ 

    /* 
     * Obsolete names 
     */ 
    SC_ICON = SC_MINIMIZE, 
    SC_ZOOM = SC_MAXIMIZE, 
} 


// http://www.pinvoke.net/default.aspx/Enums/ShowWindowCommand.html 
enum ShowWindowCommands 
{ 
    /// <summary> 
    /// Hides the window and activates another window. 
    /// </summary> 
    Hide = 0, 
    /// <summary> 
    /// Activates and displays a window. If the window is minimized or 
    /// maximized, the system restores it to its original size and position. 
    /// An application should specify this flag when displaying the window 
    /// for the first time. 
    /// </summary> 
    Normal = 1, 
    /// <summary> 
    /// Activates the window and displays it as a minimized window. 
    /// </summary> 
    ShowMinimized = 2, 
    /// <summary> 
    /// Maximizes the specified window. 
    /// </summary> 
    Maximize = 3, // is this the right value? 
        /// <summary> 
        /// Activates the window and displays it as a maximized window. 
        /// </summary>  
    ShowMaximized = 3, 
    /// <summary> 
    /// Displays a window in its most recent size and position. This value 
    /// is similar to <see cref="Win32.ShowWindowCommand.Normal"/>, except 
    /// the window is not activated. 
    /// </summary> 
    ShowNoActivate = 4, 
    /// <summary> 
    /// Activates the window and displays it in its current size and position. 
    /// </summary> 
    Show = 5, 
    /// <summary> 
    /// Minimizes the specified window and activates the next top-level 
    /// window in the Z order. 
    /// </summary> 
    Minimize = 6, 
    /// <summary> 
    /// Displays the window as a minimized window. This value is similar to 
    /// <see cref="Win32.ShowWindowCommand.ShowMinimized"/>, except the 
    /// window is not activated. 
    /// </summary> 
    ShowMinNoActive = 7, 
    /// <summary> 
    /// Displays the window in its current size and position. This value is 
    /// similar to <see cref="Win32.ShowWindowCommand.Show"/>, except the 
    /// window is not activated. 
    /// </summary> 
    ShowNA = 8, 
    /// <summary> 
    /// Activates and displays the window. If the window is minimized or 
    /// maximized, the system restores it to its original size and position. 
    /// An application should specify this flag when restoring a minimized window. 
    /// </summary> 
    Restore = 9, 
    /// <summary> 
    /// Sets the show state based on the SW_* value specified in the 
    /// STARTUPINFO structure passed to the CreateProcess function by the 
    /// program that started the application. 
    /// </summary> 
    ShowDefault = 10, 
    /// <summary> 
    /// <b>Windows 2000/XP:</b> Minimizes a window, even if the thread 
    /// that owns the window is not responding. This flag should only be 
    /// used when minimizing windows from a different thread. 
    /// </summary> 
    ForceMinimize = 11 
} 
+0

あなたはこれを行うためにShowWindowを使用するつもりです –

+0

@DavidHeffernanええ、私はその呼び出しにも遭遇しましたが、OPが明示的にPostMessageを要求したので、私はShowWindowでカバーされていないことをする必要があると仮定しましたが、また完成度は – rene

+0

@reneです。これは包括的な答えです。お時間をいただきありがとうございます。私の場合は、ウィンドウをより詳細に制御することを期待しているので、 "PostMessageSafe"は "ShowWindow"よりも優れた選択肢です。 また、 "SendInput"関数を使用してキーボードイベントをエミュレートして、Alt +下矢印などのメニュー選択を制御します。 "PostMessageSafe"と "SendInput"の組み合わせで自分の必要条件を満たすことができます。 ありがとうございます。 –

関連する問題