# 如何在遠端電腦彈出訊息
###### tags: `ChangingTec-Windows開發`
### 前言
在Command中我們可以利用msg指令來向某一台電腦發出訊息
```shell=
msg /SERVER:<IP> * "message"
```
結果如下圖所示,可以在遠端的電腦產生一個彈跳視窗顯示訊息。

這篇文章主要是提供在Windows平台下如何使用C++來產生相同的功能。
(使用Visual Studio 2019編譯)
### 程式碼
大部分遠端的功能,WinSocket或RPC等等,都需要先和遠端的裝置進行連接,所以下面範例會先看到第一步驟是要先OpenServer(接受連接者稱為Server)。在Open完後我們要選擇Session來進行傳輸,Session可以想成是{傳輸者,接收者}之間的一條傳輸通道,在這邊我們選擇Console。
最後我們使用SendMessage來傳輸我們的資料,在這個函式中我們可以做以下設定:
(1) 傳送的標題與內容
(2) 客製化MessageBox選項(eq:MB_OK, MB_HELP......)
(3) Timeout設定
(4) 是否等待伺服器端回傳結果
詳細的資訊可以參考官方網站的API。
https://docs.microsoft.com/en-us/windows/win32/api/wtsapi32/nf-wtsapi32-wtssendmessagew
```cpp=14
#include <Windows.h>
#include <WtsApi32.h>
#include <iostream>
#include <string>
using namespace std;
int main() {
const char* sendTitle = "Title";
const char* sendMessage = "Message";
DWORD response;
PWTS_SESSION_INFOA sessionInfo;
DWORD sessionCount;
HANDLE remoteHost = WTSOpenServerExA((LPSTR)"Your Remote Computer IP");
if (!WTSEnumerateSessionsA(
remoteHost,
0,
1,
&sessionInfo,
&sessionCount
))
{
return -1;
}
for (unsigned int i = 0; i < sessionCount; i++) {
if (0==strcmp(sessionInfo[i].pWinStationName, "Console")) {
cout << sessionInfo[i].pWinStationName << endl;
WTSSendMessageA(
remoteHost,
sessionInfo[i].SessionId,
(LPSTR)sendTitle,
strlen(sendTitle),
(LPSTR)sendMessage,
strlen(sendMessage),
MB_OK,
0,
&response,
TRUE
);
}
}
WTSFreeMemory(sessionInfo);
WTSCloseServer(remoteHost);
}
```