Я бы порекомендовал импортировать и определить следующее:
[System.Runtime.InteropServices.DllImportAttribute("user32.dll")]
public static extern bool PostMessage(IntPtr handleWnd, UInt32 Msg, Int32 wParam, Int32 lParam);
const int WM_ENDSESSION = 0x0016,
WM_TRUE = 0x1,
WM_FALSE = 0x0;
Затем отправьте через 0x1 или 0x0, представляющие истину или ложь в качестве сообщения wParam.
Итак, в вашем коде вы будете использовать:
PostMessage(HandleToSendTo, WM_ENDSESSION, WM_TRUE, 0);
Где HandleToSendTo - дескриптор окна, в которое вы хотите отправить сообщение.
Редактировать
Чтобы получить дескриптор окна, если вы его не знаете, я предполагаю, что вы будете знать, что это заголовок или имя. Если это так, вы можете использовать это:
[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
public static extern int FindWindowEx(int hwndParent, int hwndEnfant, int lpClasse, string lpTitre);
Какую дополнительную информацию можно найти в этом вопросе.
Или, может быть,
Я не знаю, является ли это похожим дескриптором, я сомневаюсь в этом, но кто-то может сообщить мне, если это так, но вы можете получить дескриптор процесса, что означает, что вы можете получить процесс, используя Process.GetProcessesByName (" MyAppName ") ;, хотя и не полагайтесь на это, поскольку я не думаю, что он получит тот дескриптор, который вам нужен. Просто предложение.