PDA

View Full Version : سوال: طريقه كار با SendMessage



Reza_Yarahmadi
یک شنبه 07 شهریور 1389, 15:16 عصر
سلام به همه
چندتا مثال در رابطه با SendMessage پيدا كردم ولي توي همشون اطلاعات مورد نظر براي برنامه ديگه اي ارسال شده ولي من ميخوام براي برنامه خودم ارسال كنم!
ميخوام وقتي برنامه در حال اجراست و كاربر ميخواد يكبار ديگه برنامه رو باز كنه به وسيله SendMessage به برنامه اول يك سري اطلاعات ارسال كنم.
توي كد زير چندتا ابهام برام وجود داره

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

private void button1_Click(object sender, EventArgs e)
{
//Pointer to Calculator window
IntPtr calcPtr = IntPtr.Zero;
//Search For the Calculator Window SciCalc is Windows class
calcPtr = FindWindow("SciCalc", "Calculator");
//If Found it
if (!calcPtr.Equals(IntPtr.Zero))
{
IntPtr backSpaceButton = IntPtr.Zero;
//Search For Backspace Button
backSpaceButton = FindWindowEx(calcPtr, IntPtr.Zero, "Button", "Backspace");
//If Found it
if (!backSpaceButton.Equals(IntPtr.Zero))
{
// 0x00F5 is BM_Click Message
SendMessage(backSpaceButton, 0x00F5, IntPtr.Zero, IntPtr.Zero);
}
}
}
اين كد كليد backspace رو براي ماشين حساب ارسال ميكنه.
سوال من اينه كه پارامترهاي SciCalc ، Calculator ،‌ Button ، Backspace كه همگي بصورت رشته اي ارسال شدند چي هستن و براي فرستادن پيام به برنامه خودم بايد چه مقداري داشته باشن؟

Reza_Yarahmadi
دوشنبه 08 شهریور 1389, 08:05 صبح
دوستان كسي نيست در اين زمينه كمكم كنه؟

Saeed_m_Farid
دوشنبه 08 شهریور 1389, 11:44 صبح
ميخوام وقتي برنامه در حال اجراست و كاربر ميخواد يكبار ديگه برنامه رو باز كنه به وسيله SendMessage به برنامه اول يك سري اطلاعات ارسال كنم.
اين كد كليد backspace رو براي ماشين حساب ارسال ميكنه.
سوال من اينه كه پارامترهاي SciCalc ، Calculator ،‌ Button ، Backspace كه همگي بصورت رشته اي ارسال شدند چي هستن و براي فرستادن پيام به برنامه خودم بايد چه مقداري داشته باشن؟

1- بک سری اطلاعات مثلاً چی؟ اگه مثل کدی که تو پست تون هست میخواهید یه کلیک رو شبیه سازی کنید و یا با یکی از کامپوننت های رو فرم کار کنید و ... همین کاری که تو این کد انجام شده، میتونه واسه شما هم جوابگو باشه چون یه نسخه از برنامه خودتون در حال اجرا هست پس شما نام کلاس ها و Text کامپوننت ها رو میدونید؛ ولی مثلاً برای ارسال یک عدد، رشته یا کلاس و ... به برنامه و استفاده از اون برای منظور خاص، باید یک ویندوز پروسیجر بنویسید که علاوه بر مدیریت رخدادهای معمول، این پیغام ها رو هم مدیریت کنه که یکم جزئیاتش زمان بر هست، قبلش باید جواب سوال های دیگه رو بگیرید بعد ... : البته شاید راه های دیگه هم باشه که من ازشون اطلاع ندارم، چون ما یکمی قدیمی هستیم :خجالت:

2- این کد پنجره ای بنام Calculator از کلاس SciCalc رو میگرده و در صورت یافت شدن فرم و وجود کلید Backspace (از کلاس Button) رو بررسی و کلیک را شبیه سازی میکنه، نه اینکه فقط ارسال پارامتر انجام بشه.

3- این رشته ها ارسال نشدن! همانطور که گفتم اینها نام یک کامپوننت روی یک فرمی هستند با مشخصات (نام Calculator کلاس SciCalc)؛ بعبارت دیگه اگه یک فرم با نام Calculator از کلاس SciCalc پیدا بشه، دکمه Backspace (از کلاس Button) کلیک میشه.

تنها چیزی که ارسال شده 0x00F5 بعنوان BM_Click هست که به اشاره گر یا هندل دکمه backSpaceButton فرستاده میشه و چیزی هم بعنوان پارامتر فرستاده نمیشه، بلکه IntPtr.Zero برای LParam و WParam فرستاده میشه ...

Reza_Yarahmadi
دوشنبه 08 شهریور 1389, 13:04 عصر
اول بگم كه كارمون با يه ذره تغيير راه افتاده ولي دوست دارم بدونم كه اين پارامترها چي هستن.
هدف انجام كار زير بود
http://www.barnamenevis.org/forum/showthread.php?t=242649
براي انجام اين كار به اين نتيجه رسيديم كه بايد از SendMessage استفاده كنيم و به برنامه اول خبر بديم فايل جديد رو باز كنه (عملي مثل وقفه توليد كنيم).
كار كد رو ميدونم توي توضيحات كسي كه اين فايل رو گذاشته بود هم يه چيزايي گفته بود ولي به همون نحو روي برنامه خودمون تغيير داديم عمل نكرد.
مثال: توي كد زير ميخوايم با اين روش دكمه اي با اسم button1 توي فرمي با نام Form1 صدا بزنيم:

IntPtr fPtr = IntPtr.Zero;
fPtr = FindWindow("Form1", "Form1");
if (!fPtr.Equals(IntPtr.Zero))
{
IntPtr btn1 = IntPtr.Zero;
btn1 = FindWindowEx(fPtr, IntPtr.Zero, "Button", "button1");
if (!btn1.Equals(IntPtr.Zero))
SendMessage(btn1, 0x00F5, IntPtr.Zero, IntPtr.Zero);
}ولي عمل نميكنه!!

Saeed_m_Farid
سه شنبه 09 شهریور 1389, 09:25 صبح
به احتمال 99% نام کلاس تطابق نداره، یکبار بجای نام کلاسها null بذارید، ببینید جواب میده؟ یعنی :

IntPtr fPtr = IntPtr.Zero;
fPtr = FindWindow(null, "Form1");
if (!fPtr.Equals(IntPtr.Zero))
{
IntPtr btn1 = IntPtr.Zero;
btn1 = FindWindowEx(fPtr, IntPtr.Zero, null, "button1");
if (!btn1.Equals(IntPtr.Zero))
SendMessage(btn1, 0x00F5, IntPtr.Zero, IntPtr.Zero);
}


در ضمن حتماً میدونید که نباید این کدها از دکمه مشابه فراخوانی بشن، یعنی بخواهید تو هر دو (یا چند) نسخه اجرا شده از برنامه با زدن یک کلید، در نسخه دیگه هم همین کلید زده بشه، در اینصورت هی این به اون SendMessage میکنه و برعکس تا هر دو نسخه اجرا شده از برنامه Don't Send بدن! بعبارت دیگه این کد نباید تو button1_Click قرار داده بشه مگر اینکه تمهیداتی براش بیاندیشید ...