WinForms UI の別のプロセスからシステム メニュー (最小化、復元などを含む) を表示しようとしています。GetSystemMenu や TrackPopupMenuEx などの相互運用呼び出しが必要であることは理解していますが、機能させることができませんでした。誰かがそれを行う方法のサンプルコードを提供できますか?
このコード スニペット (WPF 用) を見つけました: 別のアプリケーションのシステム メニューを開く
私はそれを次のように変更しました:
const uint TPM_LEFTBUTTON = 0x0000;
const uint TPM_RETURNCMD = 0x0100;
const uint WM_SYSCOMMAND = 0x0112;
[DllImport("user32.dll")]
static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
[DllImport("user32.dll")]
static extern uint TrackPopupMenuEx(IntPtr hmenu, uint fuFlags, int x, int y, IntPtr hwnd, IntPtr lptpm);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
public void ShowContextMenu()
{
IntPtr wMenu = GetSystemMenu(ExternalWindowHandle, false);
// Display the menu
uint command = TrackPopupMenuEx(wMenu, TPM_LEFTBUTTON | TPM_RETURNCMD, 10, 10, ExternalWindowHandle, IntPtr.Zero);
if (command == 0)
return;
PostMessage(ExternalWindowHandle, WM_SYSCOMMAND, new IntPtr(command), IntPtr.Zero);
}
質問のタイトルで述べたように、システム トレイのウィンドウを最小化したくありません。別のプロセス (ウィンドウ) から選択した場所にシステム メニューを表示したいと考えています。Windows のタスクバーとほぼ同じです。タスクバー(エクスプローラー)は、タスクバー上で右クリックするとシステムメニューを表示できるようです。
ありがとう、ステファン