PDA

View Full Version : سوال: ايونت براي پنجره مينيمم شده!



mahboube
سه شنبه 23 شهریور 1389, 09:12 صبح
سل
دوستان من يك ايونت براي پنجره مينيمم شده ميخام،ميخام هر وقت روي اسم پنجره مينيمم شده تو تسك بار ميرم اجرا شه.داريم همچين چيزي؟؟
ممنون

fjm11100
سه شنبه 23 شهریور 1389, 09:28 صبح
اجرا شه؟ مگه اجرا نشده مینیمم شده؟؟؟!! واضح بپرس

mahboube
سه شنبه 23 شهریور 1389, 09:37 صبح
اجرا شه؟ مگه اجرا نشده مینیمم شده؟؟؟!! واضح بپرس
نه ببين رفيق
فرمم مينيمم شده توي تسك بار داره نشونش ميده،يا(اگر showintaskbar رو فالس كني روي تسك بار(بالاي تسك بار)نشونش ميده،حالا من ميخوام روي ايكنش تو تسك بار كه مي رم يه كاري رو انجام بدم،يه ايونت مي خوام!

fjm11100
سه شنبه 23 شهریور 1389, 09:52 صبح
همینطوری نمیشه چون وقتی فرم برنامه شما active نیست یا توی taskbar جمع شده ویندوز پیامها را به اون نمیفرسته. اصولا ویندوز پیامها را به فرم فعال میفرسته. اما میتونی پیامهای ویندوز را هوک کنی که توی دات نت کار راحتی نیست و باید از api استفاده کنی (هوک از اون چیزایی که توی دات نت پیاده سازی نشده البته یادم می آد یک dll متفرقه بود که هوک را بصورت manage شده در اختیار شما میزاره اما اسمش یادم نیس!)

mahboube
سه شنبه 23 شهریور 1389, 10:03 صبح
همینطوری نمیشه چون وقتی فرم برنامه شما active نیست یا توی taskbar جمع شده ویندوز پیامها را به اون نمیفرسته. اصولا ویندوز پیامها را به فرم فعال میفرسته. اما میتونی پیامهای ویندوز را هوک کنی که توی دات نت کار راحتی نیست و باید از api استفاده کنی (هوک از اون چیزایی که توی دات نت پیاده سازی نشده البته یادم می آد یک dll متفرقه بود که هوک را بصورت manage شده در اختیار شما میزاره اما اسمش یادم نیس!)

مرسي
من تو تابع هاي api دنبال چي بگردم ؟؟
به اين كده داره يه همچين كاري مي كنه؟


LRESULT CALLBACK HookProc(int iCode, WPARAM wParam, LPARAM lParam)
{
if(iCode >= 0)
{
if(wParam == WM_LBUTTONDOWN)
{
MessageBoxA(NULL, "Click!", "Note", MB_OK);
}
}
CallNextHookEx(hook, iCode, wParam, lParam);

return S_OK;
}

hook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)HookProc, GetModuleHandle(NULL), 0);

fjm11100
سه شنبه 23 شهریور 1389, 10:29 صبح
به اين كده داره يه همچين كاري مي كنه؟


آره تقریبا. چندتا لینک تپل کار راه بنداز برات میزارم یک سر نگاه کن
http://www.codeproject.com/KB/cs/globalhook.aspx
http://www.codeproject.com/KB/cs/netwin32hooks.aspx
http://support.microsoft.com/kb/318804
http://blogs.msdn.com/b/toub/archive/2006/05/03/589468.aspx

mahboube
سه شنبه 23 شهریور 1389, 10:52 صبح
آره تقریبا. چندتا لینک تپل کار راه بنداز برات میزارم یک سر نگاه کن
http://www.codeproject.com/KB/cs/globalhook.aspx
http://www.codeproject.com/KB/cs/netwin32hooks.aspx
http://support.microsoft.com/kb/318804
http://blogs.msdn.com/b/toub/archive/2006/05/03/589468.aspx

مرسي ولي آقا اينا خيلي سختن!!!
هنوز نميدونم اين جناب هوك چي هست؟!دوس داشتي يكم توضيحات هم بده!مرسي.

fjm11100
سه شنبه 23 شهریور 1389, 11:03 صبح
هوک یه جورایی مثل گوش وایستادنه. ببین سیستم عامل ویندوز پیامهایی که از کاربر دریافت میکنه (و پیامهای سیستم را) بین برنامه های در حال اجرا توزیع میکنه تا هر برنامه ای بدونه این حرکت ماوس یا دکمه کیبرد متعلق به اون هست یا نه. پیامهای کاربر تنها به پنجره فعال ارجاع داده میشن. حالا شما میتونی توسط هوک این پیامها را وسط راه بگیری و به برنامه خودت بدی. مختصر و مفید توضیح دادم اما کل قصه خیلی مفصلتره

mahboube
سه شنبه 23 شهریور 1389, 15:06 عصر
آقا با اين هوكه كار من نشد!
اصلا نمي فهمه كي ايونت رو براي پنجره من اجرا كنه،هرجاي صفحه كه كليك كنم براي فرمم اجرا ميشه!!!
البته يكم موضوع سختيه،احتمالا من نفهميدمش درست،ولي من مي خوام فقط روفرمم تو تسك بار كه كليك مي كنه ايونته اجرا شه،اين براش فرق نمي كنه كلا هر جا كليك ميشه تابعم اجرا ميشه.

mahboube
سه شنبه 23 شهریور 1389, 16:20 عصر
آقا با اين هوكه كار من نشد!
اصلا نمي فهمه كي ايونت رو براي پنجره من اجرا كنه،هرجاي صفحه كه كليك كنم براي فرمم اجرا ميشه!!!
البته يكم موضوع سختيه،احتمالا من نفهميدمش درست،ولي من مي خوام فقط روفرمم تو تسك بار كه كليك مي كنه ايونته اجرا شه،اين براش فرق نمي كنه كلا هر جا كليك ميشه تابعم اجرا ميشه.
البته يك راهش اينه كه مختصات رو بگيري و بهش بگي توي مختصات موردنظر اجراشه..

mahboube
چهارشنبه 24 شهریور 1389, 09:06 صبح
دوستان اين برنامه يك ارور مسخره ميده كه نميفهممش(كارر با هوك هست براي ايونت هاي موس).
كلاسش براي پروژه خودش(ازكدپروجكت گرفتم) اجراميشه ولي وقتي تو برنامه مينويسيش يا اضافش مي كني ارور ميده.من زياد كداشو نميفهمم برا همين ممنون ميشم اگه راهنمايي كنيد.
بعد اگر كسي كداشو مي دونه(قبلا كار كرده)يه توضيح كوچيك بده خيلي ادم باحاليه!
مرسي.

fjm11100
چهارشنبه 24 شهریور 1389, 10:50 صبح
نه دیگه، این تازه اولشه! بعد باید هندل شیی که پیام موس بهش فرستاده را بدست بیاری و بعد چک کنی ببینی آیا این همون شی هست یا نه

mahboube
چهارشنبه 24 شهریور 1389, 11:04 صبح
نخيرشم!اصلنم نميخاست!(شوخي)لازم نيست شي رو چك كنم من فقط آدرس يه مستطيل كه پوزيشن پنجرمه رو دادم و گفتم اگر تو اين ناحيه كليك شد)ايونتو بده به اين پنجره!حالا براي مشكلاي بعدي مزاحم ميشم!!
اين لينكه خيلي باحاله كارمو راه انداخت.(البته تااينجا،هنوز شايد به مشكل بخورم)!
http://support.microsoft.com/kb/318804

fjm11100
چهارشنبه 24 شهریور 1389, 12:03 عصر
پوزشنش رو تسکبار ثابته؟ با تغییر رزولوشن هم کار میکنه؟ اگر تسکبار autohide باشه چی؟ اصلا اگر تسکبار پائین صفحه نباشه و مثلا بالا باشه چی؟ بنظر من پوزیشن خطرناکه

mahboube
چهارشنبه 24 شهریور 1389, 12:33 عصر
پوزشنش رو تسکبار ثابته؟ با تغییر رزولوشن هم کار میکنه؟ اگر تسکبار autohide باشه چی؟ اصلا اگر تسکبار پائین صفحه نباشه و مثلا بالا باشه چی؟ بنظر من پوزیشن خطرناکه
تو تسكبار نيست روي تسكباره و من دارم با top,left,right,buttom خودپنجره كارميكنم كه مهم نيست كجاي صفحه باشه!!(تازه تااينجاشم پدرم دراومده تابرسه به چك كردن شي و...)
قربونت حالا كه داري هلپ ميدي اين كدو يه نگاه كن ببين ميفهمي ارورش براچيه.
تو لينكه كه دادم براي دادن x,y وس كار ميكنه ولي وقتي كليكو اضافه مي كنم ارور ميده(delegate و ين حرفا)من كه نفهميدم چرا!!!
مرسي.

fjm11100
چهارشنبه 24 شهریور 1389, 13:12 عصر
خب این بنده خدا
mousehooke.Form1.MouseHookProcedure
را کجا مقدار دهی میکنی؟ delegate را باید با یک متد مقدار بدی.

flash118
چهارشنبه 24 شهریور 1389, 13:19 عصر
آقا یه نگاه هم به این بنداز فکر کنم از کد پراجکت گرفتمش دقیق یادم نیست فکر کنم راهنمای خوبی باشه

mahboube
چهارشنبه 24 شهریور 1389, 13:22 عصر
خب این بنده خدا
mousehooke.Form1.MouseHookProcedure
را کجا مقدار دهی میکنی؟ delegate را باید با یک متد مقدار بدی.

نه اين درس شد!!اشتباه ضايع بود(اسم تابع رو اشتباهي مي دادم!!خب ديگه اينقد قاطي بود گيج شدم).تازه فهميدم اينقدام قرطي بازي نداره يه تابع api ديگه .بايد مثل بقيه صداش زد فقط!!!


HookProc MouseHookProcedure = newHookProc(MouseHookProc);

ولي حالا تو صدا زدن
SetWindowsHookEx مشكل دارم!!ايشا.. درس ميشه!!
مرسي

fjm11100
چهارشنبه 24 شهریور 1389, 13:30 عصر
خب این متد که با delegate جور نیس

mahboube
چهارشنبه 24 شهریور 1389, 13:37 عصر
خب این متد که با delegate جور نیس


publicdelegateintHookProc(int nCode, int wParam, IntPtr lParam);
//
HookProc MouseHookProcedure = newHookProc(MouseHookProc);
//
privateint MouseHookProc(int nCode, int wParam, IntPtr lParam)

درس ميشه!!(منم قبلااينشكلي كار نكرده بودم)!!!

mahboube
چهارشنبه 24 شهریور 1389, 14:12 عصر
تقريبا درست شد.
روي شكل فراخواني تابع SetWindowsHookEx خيلي گيره!




hHook = SetWindowsHookEx(WH_MOUSE,
MouseHookProcedure,
(IntPtr)0,
AppDomain.GetCurrentThreadId());
بعدشم بايد:

this.OnMouseActivity += new MouseEventHandler(MouseMove1);
//*********

private void MouseMove1(object sender, MouseEventArgs e)
{
كارهايي كه بايد موقع كليك انجام شه!البته ابنجا پوزيشن روبررسي مي كنيم.فقط كليكهايي كه تو ناحيه مورد نظر باشه رو برميداريم!
}




البته اين هنوزم مشكل داره!!!نميدونم چر بايد دوبار كليك كردتا اجراشه!

mahboube
چهارشنبه 24 شهریور 1389, 17:38 عصر
اون دوتا كليكه به خاطر اين بود كه تابع SetWindowsHookEx رو باWH_MOUSE (متداولش)فراخواني كردم كه اين يه جورايي توي محيط خو فرم عمل مي كنه!!(من توضيح دادن بلد نيستم!!)ولي مثلا
WH_MOUSE_LL روي كل دسك تاپ داره عمل ميكنه.
ولي حالا مشكل من:
اگه بخوام براي دو تا پنجره تابع هوك رو اجرا كنم موقعي كه مي خواد ايونت رو بفرسته فكر مي كنم قاط ميزنه!!!كه الان براكدومش اجرا كنه!چون دوتاش همزمان دارن هوك مي كنن!!!(ارور ميده در واقع)
حالا راه حل مي خوام!!پيشنهاد؟؟!!!

mahboube
پنج شنبه 25 شهریور 1389, 08:27 صبح
نه دیگه، این تازه اولشه! بعد باید هندل شیی که پیام موس بهش فرستاده را بدست بیاری و بعد چک کنی ببینی آیا این همون شی هست یا نه

وقتي پيام موس رو همزمان به دوتاپنجره ميفرستم خطا ميده!اين كه گفتي هندل شي رو بگيرم چكش كنمو يكم بيشتر توضيح مي دي؟
به نظرت اينطوري مشكل چندتا پنجره باهم حل ميشه؟
بعدش چطوري ميشه هوك رو استوپ كرد يا بهش گفت تو هر زمان براي چ پنجره اي باشه!
و اينكه هندل شي رو چطوري بگيرمapi داره ديگه!!
ممنون

mahboube
شنبه 27 شهریور 1389, 09:16 صبح
اون دوتا كليكه به خاطر اين بود كه تابع SetWindowsHookEx رو باWH_MOUSE (متداولش)فراخواني كردم كه اين يه جورايي توي محيط خو فرم عمل مي كنه!!(من توضيح دادن بلد نيستم!!)ولي مثلا
WH_MOUSE_LL روي كل دسك تاپ داره عمل ميكنه.

حالا راه حل مي خوام!!پيشنهاد؟؟!!!



:تشویق:حل شد:تشویق:
راه حلشم:
مشكل اين بود كه براي استفاده از WH_MOUSE_LL بايد:

Disable visual studio runtime host in debug properties for project.