برقراری ارتباط با اشیای یک فرم دیگر از برنامه ای دیگر
فرض کنید که دو برنامه کاملا “مجزا” از هم به صورت زیر داریم:
و می خواهیم بعد از اجرای هر دو برنامه و با زدن دکمه، متنی در داخل جعبه متن نمایش داده شود. برای این کار باید از نرم افزار ++Spy که با خود Visual Studio نصب میشه ، ابتدا Handle برنامه مورد نظر رو بدست آورده و سپس Handle کنترلی که داخل اون نرم افزار (در این مثال کنترل جعبه متن) هست . سپس با استفاده از تابع سیستمی SendMessage متن مورد نظر را داخل آن کنترل قرار دهیم.برای به دست آوردن Handle یک پنجره با استفاده از نرم افزار ++Spy به صورت زیر عمل می کنید :
بر روی دکمه دوبار کلیک کرده و کدهای زیر را بنویسید :
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 ارسال می کنیم :