PDA

View Full Version : اجرای تابعی وقتی روی دسکتاپ کلیک شد



omid nasri
شنبه 28 تیر 1393, 00:17 صبح
سلام چطور میشه فهمید وقتی روی دسکتاپ کلیک شد تابعی اجرا بشه؟ خواهش می کنم کمک کنید.

abbas.oveissi
شنبه 28 تیر 1393, 04:09 صبح
سلام چطور میشه فهمید وقتی روی دسکتاپ کلیک شد تابعی اجرا بشه؟ خواهش می کنم کمک کنید.
پشنهاد من این است که از هوکینگ استفاده کنید که کلیک موس رو بتونید در خارج از برنامه خودتون تشخیص دهید.حالا بعد این مرحله باید بفهمید کجا کلیک شده،چون خیلی وقته گذشته از آخرین بار که از Hooking و Global Hooking استفاده کردم یادم نیست میشد فهمید روی چه Windowایی کلیک شده یا نه!شاید راه حل ابتکاری هم بشه پیدا کرد.
حالا منم منتظر میشینم ببینم،دوستان دیگه نظرشون چیه تا منم یاد بگیرم :لبخند:

آپدیت 1: من الان MOUSEHOOKSTRUCT رو دیدم یک hwnd هم توش داره.شاید بشه ازش کمک گرفت.
آپدیت 2: جالبه وقتی از هوکینک Low-Level Mouse که دات نت و سی شارپ پشتیبانی میکنه استفاده کنید MSLLHOOKSTRUCT رو بر میگردونه که هندل صفحه ای که روش کلیک شده رو نداره !! :متفکر:
آپدیت 3:من هر چقدر تلاش کردم نشد،چنتا راه حل به ذهنم رسید اما نشدند :ناراحت: نتیجه فقط این بود تونستم با Global Hooking بفهمم موس کجا کلیک میشه!اما نشد بفهمم روی دسکتاپ کلیک شده یا نه!!

omid nasri
شنبه 28 تیر 1393, 09:30 صبح
دوستان خواهش می کنم کمک کنید ، توضیحات بیشتر :

من برنامه ای دارم که هر بار سیستم بالا میاد این برنامه هم اجرا می شود، می خوام وقتی کاربر روی دسکتاپ دو بار کلیک کرد تابع موجود در برنامه من اجرا شود خواهش می کنم کمک کنید؟ خواهش می کنم.

aliagamon
شنبه 28 تیر 1393, 10:04 صبح
میتونید با استفاده از GetForegroundWindow چک کنید focus رو چه برنامه ای هست ... اگه اشتباه نکنم title دسکتاپ program manager باید باشه .. .اینو با چیزی که دوستمون گفت ترکیب کن ... میشه چیزی که میخوای ... (البته فکر کنم ... امتحان نکردم )

omid nasri
شنبه 28 تیر 1393, 10:41 صبح
دوستان یک مرجع فارسی برای هوگ اگه بدین ممنون میشم می خوام با فرم های خارجی مرج کنم.ممنون

elec60
شنبه 28 تیر 1393, 10:43 صبح
GetForegroundWindow تابعیه که هندل ‍‍ویندو دارای فوکوس رو برمیگردونه و هندل مربوط به Desktop احتمالا صفره(تست کن)

تو MSDN یه تابع گفته بنظر میاد کاری که میخوای انجام بده. الان به VS دسترسی ندارم تست کنم:

GetDesktopWindow function (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633504%28v=vs.85%29.aspx)

omid nasri
شنبه 28 تیر 1393, 11:34 صبح
لطفا یک مرجع برای هوک بدید؟

aliagamon
شنبه 28 تیر 1393, 14:01 عصر
این مرجع واسه هوک موس :http://www.codeproject.com/Articles/7294/Processing-Global-Mouse-and-Keyboard-Hooks-in-C
بعد بیا بگو اگه دابل کلیک شد چک کن پنجره ی اکتیو چیه اگه دسکتاپه تابع رو اجرا کنه ...
http://stackoverflow.com/questions/115868/how-do-i-get-the-title-of-the-current-active-window-using-c

abbas.oveissi
شنبه 28 تیر 1393, 17:52 عصر
میتونید با استفاده از GetForegroundWindow چک کنید focus رو چه برنامه ای هست ... اگه اشتباه نکنم title دسکتاپ program manager باید باشه .. .اینو با چیزی که دوستمون گفت ترکیب کن ... میشه چیزی که میخوای ... (البته فکر کنم ... امتحان نکردم )
اینو من دیشب تست کردم اما جواب نمیده.زمانی روی دسکتاپ هست،اصولا آخرین پنجره که فوکوس روش بوده رو بر میگردونه

omid nasri
شنبه 28 تیر 1393, 19:52 عصر
دوستام خواهش می کنم اگر می دونید یا تجربه دارید بیان کنید همه استفاده کنیم ، می خوام وقتی روی دسکتاپ کلیک شد تابع موجود که تعریف شده در برنامه در حال اجرای من اجرا شود من قبلا کدی داشتم که مکان موس رو می داد الان ندارم وگر نه یک جوری دست می کردم.

abbas.oveissi
شنبه 28 تیر 1393, 21:29 عصر
دوستام خواهش می کنم اگر می دونید یا تجربه دارید بیان کنید همه استفاده کنیم ، می خوام وقتی روی دسکتاپ کلیک شد تابع موجود که تعریف شده در برنامه در حال اجرای من اجرا شود من قبلا کدی داشتم که مکان موس رو می داد الان ندارم وگر نه یک جوری دست می کردم.
من یک نمونه پروژه براتون پیوست کردم،برای Hooking موس هست که هر جا کلیک کنید تابع HookCallback در برنامه فراخوانی میشود.کدی که توی پروژه هست آخرین تست هام بوده که از GetForegroundWindow استفاده میکنه و بعد تیتر اون Window رو بر میگردونه.اگر مکان موس رو میخواید میتونید بجای کد من از hookStruct.pt.x و hookStruct.pt.y استفاده کنید تا مکان موس در نقطه ای که کلیک شده را در MessageBox ببینید.

aliagamon
شنبه 28 تیر 1393, 22:17 عصر
بفرما اینو با ترکیب اون دوتا لینکی که دادم درست کردم خدمت شما ....:لبخند:
تیک دابل کلیک رو بزنین بعد تست کنین ...

abbas.oveissi
شنبه 28 تیر 1393, 22:28 عصر
بفرما اینو با ترکیب اون دوتا لینکی که دادم درست کردم خدمت شما ....:لبخند:
تیک دابل کلیک رو بزنین بعد تست کنین ...
ااا چه باحال!درست کار کرد.میشه بگید چرا پس وقتی من از GetForegroundWindow استفاده میکردم جواب غلط میداده؟کار خاصی انجام شده؟


آپدیت : باگ داره،اگر با Ctrl+tab یا اون دکمه گوشه ی Taskbar برید دسکتاپ نمیتونه تشخیص بده :متفکر:

aliagamon
شنبه 28 تیر 1393, 22:52 عصر
ااا چه باحال!درست کار کرد.میشه بگید چرا پس وقتی من از GetForegroundWindow استفاده میکردم جواب غلط میداده؟کار خاصی انجام شده؟


آپدیت : باگ داره،اگر با Ctrl+tab یا اون دکمه گوشه ی Taskbar برید دسکتاپ نمیتونه تشخیص بده :متفکر:
والا من روش شما رو ندیدم ...ولی احتمالا اول شما تایتل رو میگیرین بعد کلیک رو ارسال میکنین ... چون وقتی هوک میکنین دیگه کلیک ثبت نمیشه .. (بد دارم میگم منظورمو فهمیدم اما میخوام بگم وقتی هوک شده شما کلیک میکنین انگار کلیک نکردین ... و دوباره باید با api کلیک رو بفرستین .. . ممکنه شما قبل ارسال کلیک تایتل رو بگیرین )
در مورد باگ هم چک کردم ... نال برمیگردونه تایتل رو مثل اینکه فوکوس نشده ... چک میکنم ببینم راهی پیدا میکنم یا نه (فکر کنم بدونم چطوری میشه درست کردش)

abbas.oveissi
شنبه 28 تیر 1393, 23:05 عصر
والا من روش شما رو ندیدم ...ولی احتمالا اول شما تایتل رو میگیرین بعد کلیک رو ارسال میکنین ... چون وقتی هوک میکنین دیگه کلیک ثبت نمیشه .. (بد دارم میگم منظورمو فهمیدم اما میخوام بگم وقتی هوک شده شما کلیک میکنین انگار کلیک نکردین ... و دوباره باید با api کلیک رو بفرستین .. . ممکنه شما قبل ارسال کلیک تایتل رو بگیرین )
در مورد باگ هم چک کردم ... نال برمیگردونه تایتل رو مثل اینکه فوکوس نشده ... چک میکنم ببینم راهی پیدا میکنم یا نه (فکر کنم بدونم چطوری میشه درست کردش)
گاگول بازی در آورده بودم.فهمیدم مشکل برنامم چی بوده:لبخند:چون MessageBox گذاشته بودم تا کلیک میکردم فوکوس میومده روی پیام ها !! کد رو تغییر دادم تا بجای MessageBox توی یک رشته ذخیره کنه و درست شد:لبخند:البته همون باگی که گفتم رو کد من هم داره دیگه،چون از یک چیز استفاده کردیم.

omid nasri
یک شنبه 29 تیر 1393, 02:01 صبح
اگه یک توضیح کامل درباره هوک بدی و مثالی کوچک ممنون میشم.