ããã»ã¹ééä¿¡(IPC)ã®æ¹æ³ã®ïŒã€ãšããŠã
SendMessage(ã»ã³ãã¡ãã»ãŒãž)ãšPostMessage(ãã¹ãã¡ãã»ãŒãž)ããããŸãã
ãã®ïŒã€ã«ã€ããŠã話ããŠãããŸãããã
- ããã»ã¹ééä¿¡(IPC)ãšã¯
- SendMessageãšPostMessageã«ã€ããŠ
- SendMessageãšPostMessageã®éã
- SendMessageãšPostMessageããœããäœæ(GUI)
- SendMessageãšPostMessageããœããäœæ(DLLImport)
- SendMessageãšPostMessageããœããäœæ(éä¿¡éš)
- SendMessageãšPostMessageããœããäœæ(åä¿¡éš)
- ãŸãšã
ããã»ã¹ééä¿¡(IPC)ãšã¯
ããã»ã¹ééä¿¡(Interprocess Communication)ãç¥ããŠãIPCã§ãã
è€æ°ã®ããã»ã¹ãããŒã¿ããããšãããä»çµã¿ã®äºãããã»ã¹ééä¿¡ãšèšããŸãã
ããœã³ã³å ã§ã¢ããªéãäŒè©±ããçºã®æ¹æ³ã ãšæã£ãŠãã ããã

ããã»ã¹ééä¿¡ã®ææ³ã¯äžèšã®ãããªæ¹æ³ããããŸãã
å æ¥è¡ã£ããœã±ãã(Socket)ãããã»ã¹ééä¿¡ã®ïŒã€ã§ãã
ä»åã¯ãã¡ãã»ãŒãžã䜿ããããšæããŸãã
SendMessageãšPostMessageã«ã€ããŠ
ä»å䜿ãSendMessageãšPostMessageã¯ããã©ãŒã éã§ããåããããŸãã
ãã©ãŒã ãšãã©ãŒã ãéåä¿¡ãè¡ãä»çµã¿ã§ãã
ã©ããªæã«äœ¿ãããšãããšãã¢ããªAãšã¢ããªBããã£ããšããŸãã
ã¢ããªAã®ãã¿ã³ãæŒãããæã«ãæŒãããäºãã¢ããªBã«æããæã«äœ¿ããŸãã

ããã ãšã䜿ãéç¡ããªãïŒïŒã£ãŠæã人ããããããããŸãããã
確ãã«ãããªã«äœ¿ãããšã¯ãããŸããïœïœïœ
ãã ãäŒç€Ÿå ã§éšçœ²ãåãããŠãããåã ã®éšçœ²ã§ã¢ããªãäœãããŠããæã
ã¡ãã»ãŒãžãè²°ããããåŠçã§ããä»çµã¿ãäœã£ãŠããã°ã
åã ã®éšçœ²ã®ã¢ããªã®å€æŽã¯ãã¡ãã»ãŒãžãéã£ãŠãããäºã®ã¿ã§æžã¿ãŸãã
SendMessageãšPostMessageã®éã
倧ããªéãã¯ãéåæåŠçãåæåŠçãã®éãã§ãã
SendMessageã¯ãéä¿¡åŸãéä¿¡çžæã®åŠçãçµãããŸã§ã次ã®åŠçã«ãããŸããã
PostMessageã¯ãéä¿¡åŸã次ã®åŠçã«è¡ããŸãããã®çºãåä¿¡çžæãšåæåŠçã«ãªããŸãã

ã¡ãªãã/ãã¡ãªããã¯ãããŸãããçšéã«åãããŠäœ¿ããŸãããã
SendMessageãšPostMessageããœããäœæ(GUI)

ãSendããã¿ã³ã§ã¯SendMessageã䜿ãã
ããã¹ãããã¯ã¹ã«å ¥åãããŠããæååãéä¿¡ããŸãã
ãPostããã¿ã³ã§ã¯PostMessageã䜿ãã
ããã¹ãããã¯ã¹ã«å ¥åãããŠããæååãéä¿¡ããŸãã
SendMessageãšPostMessageããœããäœæ(DLLImport)
SendMessage/PostMessageã§ã¯ããUser32.dllãã®äžã®é¢æ°ã䜿ããŸãã
using System.Runtime.InteropServices; //DLLImportã䜿ãããã« namespace ProcessConnect { ããpublic partial class frmSend : Form ãã{ ãããã//ãŠã£ã³ããŠãæ¢ãçšã®ã¡ãœãã ãããã[DllImport("User32.dll", EntryPoint = "FindWindow")] ããããpublic static extern Int32 FindWindow(String lpClassName, String lpWindowName); ãããã//éä¿¡ããããã®ã¡ãœãã(æ°å€) ãããã[DllImport("User32.dll", EntryPoint = "SendMessage")] ããããpublic static extern Int32 SendMessage(Int32 hWnd, Int32 Msg, Int32 wParam, ref COPYDATASTRUCT lParam); ãããã//éä¿¡ããããã®ã¡ãœãã(æåãå¯èœ) ãããã[DllImport("User32.dll", EntryPoint = "SendMessage")] ããããpublic static extern Int32 SendMessage(Int32 hWnd, Int32 Msg, Int32 wParam, Int32 lParam); ãããã//éä¿¡ããããã®ã¡ãœãã(æ°å€) ãããã[DllImport("User32.dll", EntryPoint = "PostMessage")] ããããpublic static extern Int32 PostMessage(Int32 hWnd, Int32 Msg, Int32 wParam, ref COPYDATASTRUCT lParam); ãããã//éä¿¡ããããã®ã¡ãœãã(æåãå¯èœ) ãããã[DllImport("User32.dll", EntryPoint = "PostMessage")] ããããpublic static extern Int32 PostMessage(Int32 hWnd, Int32 Msg, Int32 wParam, Int32 lParam); ãããã//æååãéä¿¡ããæã«äœ¿ãæ§é äœ ããããpublic struct COPYDATASTRUCT ãããã{ ããããããpublic IntPtr dwData; //éä¿¡ãã32ãããå€ ããããããpublic int cbData; //lpDataã®ãã€ãæ° ããããããpublic string lpData; //éä¿¡ããããŒã¿ãžã®ãã€ã³ã¿(0ãå¯èœ) ãããã}
æ§é äœã¯éä¿¡åŽãåä¿¡åŽäž¡æ¹ã«å¿ èŠã«ãªããŸãã
DLLImportã¯éä¿¡åŽã ãã«å¿ èŠã§ãã
SendMessageãšPostMessageããœããäœæ(éä¿¡éš)
æµããšããŠã¯ããã©ãŒã ã®ãŠã£ã³ããŠãã³ãã«ãååŸããŸãã
次ã«ãããã¹ãããã¯ã¹ã®å ¥åå€ããæ°å€ãã§ããã確èªããŠã
æ°å€ã®å Žåã¯ãæ°å€ãéä¿¡ããæååã®å Žåã¯ãæ§é äœãéä¿¡ããŸãã
ãSendããã¿ã³ã®åŠçã§ãã
private void btnSend_Click(object sender, EventArgs e)
{
int hWnd = FindWindow(null, "åä¿¡ãã©ãŒã ");
if (hWnd == 0)
{
//ãã³ãã«ãååŸã§ããªãã£ã
MessageBox.Show("çžæWindowã®ãã³ãã«ãååŸã§ããŸãã");
return;
}
if (int.TryParse(txtMessage.Text,out int mes))
{
//æ°å€ãéä¿¡
int result = SendMessage(hWnd, SMSG_NUM, mes, mes * 2);
}
else
{
//æåãšããŠéä¿¡
COPYDATASTRUCT cds = new COPYDATASTRUCT();
cds.dwData = (IntPtr)0;
cds.lpData = txtMessage.Text;
cds.cbData = cds.lpData.Length + 1; //é·ããã»ãã
//æååãéã
int result = SendMessage(hWnd, SMSG_STR, 0, ref cds);
}
}
ãPostããã¿ã³ã®åŠçã§ãã
private void btnPost_Click(object sender, EventArgs e)
{
int hWnd = FindWindow(null, "åä¿¡ãã©ãŒã ");
if (hWnd == 0)
{
//ãã³ãã«ãååŸã§ããªãã£ã
MessageBox.Show("çžæWindowã®ãã³ãã«ãååŸã§ããŸãã");
return;
}
if (int.TryParse(txtMessage.Text, out int mes))
{
//æ°å€ãéä¿¡
int result = PostMessage(hWnd, PMSG_NUM, mes, mes * 2);
}
else
{
//æåãšããŠéä¿¡
PstMes_T = new COPYDATASTRUCT(); ;
PstMes_T.dwData = (IntPtr)0;
PstMes_T.lpData = txtMessage.Text;
PstMes_T.cbData = PstMes_T.lpData.Length + 1; //é·ããã»ãã
//æååãéã
int result = PostMessage(hWnd, PMSG_STR, 0, ref PstMes_T);
}
}
ããã§éä¿¡éšã®å®æã§ãã
SendMessageãšPostMessageããœããäœæ(åä¿¡éš)
次ã«åä¿¡éšãäœã£ãŠãããŸãã
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case SMSG_NUM:
case PMSG_NUM:
//æ°å€ãéä¿¡ãããŠæ¥ã
string typ = (m.Msg == SMSG_NUM) ? "SendMesNum" : "PostMesNum";
txtRecieve.Text = "["+ typ + "] " + (m.WParam + "-" + m.LParam);
break;
case SMSG_STR:
case PMSG_STR:
//æåãéä¿¡ãããŠæ¥ã
typ = (m.Msg == SMSG_STR) ? "SendMesStr" : "PostMesStr";
COPYDATASTRUCT mystr = new COPYDATASTRUCT();
Type mytype = mystr.GetType();
mystr = (COPYDATASTRUCT)m.GetLParam(mytype);
txtRecieve.Text = "["+ typ + "] " + (mystr.lpData);
break;
}
base.WndProc(ref m);
}
ãŠã£ã³ããŠããã·ãŒãžã£ããªãŒããŒã©ã€ãããŸãã
ã¡ãã»ãŒãžã®çªå·ã«å¿ããŠãåŠçãåããŸãã
public const Int32 SMSG_NUM = 9999;
public const Int32 SMSG_STR = 9990;
public const Int32 PMSG_NUM = 8888;
public const Int32 PMSG_STR = 8880;
äžèšå®çŸ©ããã¡ãã»ãŒãžçªå·ãåä¿¡ãããšãã«ãåä¿¡å 容ã衚瀺ããããã«äœããŸããã
ãŸãšã
åãã¿ã³ã§å®è¡ããŠã¿ãŸããã

æååããã¹ãã¡ãã»ãŒãžã§éãäºãã§ããŸããã§ããã
åå ãåããããã§ããæ¹æ³ã調ã¹ãŠã¿ãããšæããŸãã
ã¡ãªã¿ã«ïŒåºŠã¡ãã»ãŒãžãéä¿¡ã§åããŠããã°ãäŸå€ã¯çºçããŸãããã
æåããæååã®PostMessageãéä¿¡ããå Žåã¯ãäŸå€ãçºçããŸãã

æ§é äœã®å®çŸ©ã倿Žããã°ã解決ãããããªæ°ãããŸãã
解決ããæã«ãŸãã¢ããããããšæããŸãã

æ¥åã§ããã°ã©ãã³ã°(C#/VB/Python)ãäœã£ãŠããã
æ«æãäœåãç¹°ãè¿ãã幟床ã®å£ãä¹ãè¶ããŠããã
ä¹ãè¶ããŠããäºãå¿ããªãããã«èšé²ã«æ®ãã
åãæããããŠãã人ãžã®æ
å ±æäŸã«ãªããããšæãã
åºæ¬ã¯åå¿è
ã«åããããã°ã©ã ã®æ
å ±ãæäŸããã



ã³ã¡ã³ã