برقراری ارتباط با اشیای یک فرم دیگر از برنامه ای دیگر

فرض کنید که دو برنامه کاملا “مجزا” از هم به صورت زیر داریم:
SendMessage-Intpr-C# (1)

SendMessage-Intpr-C# (6)

و می خواهیم بعد از اجرای هر دو برنامه و با زدن دکمه، متنی در داخل جعبه متن نمایش داده شود. برای این کار باید از نرم افزار ++Spy که با خود Visual Studio نصب میشه ، ابتدا Handle برنامه مورد نظر رو بدست آورده و سپس Handle کنترلی که داخل اون نرم افزار (در این مثال کنترل جعبه متن) هست . سپس با استفاده از تابع سیستمی SendMessage متن مورد نظر را داخل آن کنترل قرار دهیم.برای به دست آوردن Handle یک پنجره با استفاده از نرم افزار ++Spy به صورت زیر عمل می کنید :
SendMessage-Intpr-C# (2)

SendMessage-Intpr-C# (3)

SendMessage-Intpr-C# (4)

بر روی دکمه دوبار کلیک کرده و کدهای زیر را بنویسید :

  1: using System;
  2: using System.Runtime.InteropServices;
  3: using System.Windows.Forms;
  4: 
  5: namespace WindowsFormsApplication2
  6: {
  7:     public partial class Form1 : Form
  8:     {
  9:         #region APIFunctions
 10:             [DllImport("user32.dll", SetLastError = true)]
 11:             private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 12: 
 13:             [DllImport("user32.dll", SetLastError = true)]
 14:             private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string className, string lpszWindow);
 15: 
 16:             [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
 17:             private static extern int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, string lParam);
 18: 
 19:             private const int WM_SETTEXT = 12;  
 20:         #endregion
 21: 
 22:         public Form1()
 23:         {
 24:             InitializeComponent();
 25:         }
 26: 
 27:         private void button1_Click(object sender, EventArgs e)
 28:         {
 29:             //Get the handle of the textbox
 30:             IntPtr MainParent = FindWindow(null, "Form2");
 31:             
 32:             IntPtr child = FindWindowEx(MainParent, IntPtr.Zero, "WindowsForms10.EDIT.app.0.2bf8098_r11_ad1", null);
 33: 
 34:             //Set the password and readonly!
 35:             SendMessage(child, WM_SETTEXT, IntPtr.Zero, "w3-farsi.com");
 36:         }
 37:     }
 38: }

همانطور که در خط 30 کدهای بالا مشاهده می کنید عنوان پنجره را به تابع Findwindow و در خط 32 کلاسی کنترل کننده کنترل textbox ی را که با استفاده از نرم افزار ++Spy به دست آورده ایم به تابع FindwindowEx می دهیم و سپس در خط متنی را که قرار است در کنترل نمایش دهیم را به عنوان آرگومان به متد SendMessage ارسال می کنیم :
SendMessage-Intpr-C# (5)