PDA

View Full Version : سوال: انجام فرایند کلیک کردن بدون عمل موس



mosy_m.s
پنج شنبه 23 خرداد 1392, 17:22 عصر
سوالم اینه که مثلا تو برنامه یه دکمه داریم که می خوایم هر وقت کاربر روی این دکمه کلیک می کنه یه قسمتی از فورم- مثلا مختصات 20:20 - کلیک بشه. حتما هم لزومی نداره که توی اون قسمت از فورم آیتمی قرار داشته باشه، فقط اون جا کلیک بشه. یعنی فرایند کلیک کردن بدون عمل مستقیم موس انجام بشه.

ممنون میشم اگه کسی جواب بده.

mosy_m.s
پنج شنبه 23 خرداد 1392, 19:49 عصر
کسی نمی تونه کمک کنه؟!؟ یا شاید هم متوجه منظورم نشدید!

ashkan1234
پنج شنبه 23 خرداد 1392, 20:01 عصر
سلام فکر کنم رویداد Click واسه همین قرار داده شده!

mosy_m.s
پنج شنبه 23 خرداد 1392, 20:16 عصر
سلام فکر کنم رویداد Click واسه همین قرار داده شده!
رویداد کلیک برای وقتی هست که با موس یه جا کلیک کردی و مثلا می خوای اطلاعات مربوط به موقعیت کلیک شده رو به دست بیاری. من می خوام بدون این که با موسم کاری انجام بدم یه محل رو کلیک کنم. شما اگه می تونید با رویداد کلیک همچین کاری بکنید لطفا یه مثال قرار بدین.

hamid_hr
پنج شنبه 23 خرداد 1392, 20:16 عصر
خب وقتي كليك بشه ميخواد تابع اي اجرا بشه

mosy_m.s
پنج شنبه 23 خرداد 1392, 20:23 عصر
خب وقتي كليك بشه ميخواد تابع اي اجرا بشه
منظورتون اینه که بدون کلیک موس این عمل انجام نمی شه؟

ashkan1234
پنج شنبه 23 خرداد 1392, 20:44 عصر
ببینید نمیدونم اینی که عرض میکنم تا چه حد به پاسختون نزدیکه!
تو اونت Mouse_Click هر کدی رو که میخوایید بنویسید،مثلا بنده الان گفتم برو دکمه 2 رو روش کلیک کن:
private void FrmMain_MouseClick(object sender, MouseEventArgs e)
{
button2_Click(sender,e);
}
بعد تشریف ببرید در قسمت اونت های اون دکمه ای که مد نظرتون هست!مثلا دکمه11
در قسمت MouseClick (نکته اینکه واردش نشید،یعنی دابل کلیک نکنید)همونجا یه کلیک کنید و اینو بنویسید:
FrmMain_MouseClick
حالا وقتی روی دکمه 11 کلیک کنید میره رو دکمه 2 کلیلک میکنه!
دقیقا وقتی روی فرم هم کلیک کنید همین اتفاق میفته!
این پاسخ از چیزی بود که بنده متوجه سوالتون شدم و امیدوارم بکارتون بیاد!:لبخند:

mosy_m.s
جمعه 24 خرداد 1392, 10:09 صبح
عزیزم این کار رو که هر کسی بلده. این کاری رو که شما کردی فقط بازخوانیه یه متده که کارش کلیک روی یه دکمه است.
شما کلا فرض کن فقط یه دکمه تو برنامه هست به نامه OK که شما هر وقت این رو کلیک کردین یه قسمتی از صفحه فورم (مثلا با مختصات 20:20) کلیک بشه. یعنی بدون این که موس شما توی مختصات 20:20 کلیکی انجام داده باشه، اونجا کلیک بشه.

programerinfonet
جمعه 24 خرداد 1392, 10:30 صبح
دوست عزیز همون کدیو که میخوایی تو یک مختصات خاص کلیک کردی اجرا بشه رو مجدد فراخوانی کن
امیدوارم تونسته باشم منظورمو بفهمونم

xvahid
جمعه 24 خرداد 1392, 10:44 صبح
این کار با استفاده از کتابخانه user32.dll امکان پذیره.






using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

public class Form1 : Form
{
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);

private const int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04;
private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
private const int MOUSEEVENTF_RIGHTUP = 0x10;

public Form1()
{
}

public void DoMouseClick()
{
//Call the imported function with the cursor's current position
int X = Cursor.Position.X;
int Y = Cursor.Position.Y;
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
}

//...other code needed for the application
}



اینم منبعش :

http://www.gamedev.net/topic/321029-how-to-simulate-a-mouse-click-in-c/

mosy_m.s
جمعه 24 خرداد 1392, 11:00 صبح
دوست عزیز همون کدیو که میخوایی تو یک مختصات خاص کلیک کردی اجرا بشه رو مجدد فراخوانی کن
امیدوارم تونسته باشم منظورمو بفهمونم
یعنی چی؟
من مشکلم همینه دیگه. که کدی بلد نیستم که مثلا بهش یه X و Y بدم، بعد بگم اون نقطه رو کلیک کن.

xvahid
جمعه 24 خرداد 1392, 11:16 صبح
منظور ایشون اینه که همون کاری که میخواید در صورت کلیک شدن یک نقطه از فرم انجام بدین در صورت کلیک شدن دکمه انجام بدین. که حرف بی منطقی هم نیست به نظر من. ولی اگر اصرار دارین که همون نقطه حتماً کلیک بشه از کدی که من گذاشتم استفاده کنین.

mosy_m.s
جمعه 24 خرداد 1392, 11:32 صبح
این کار با استفاده از کتابخانه user32.dll امکان پذیره.



اینم منبعش :

http://www.gamedev.net/topic/321029-how-to-simulate-a-mouse-click-in-c/


آقا من این رو نفهمیدم. شما خودت یه توضیح میدی؟
تازه این ارور می ده.

xvahid
جمعه 24 خرداد 1392, 11:41 صبح
چه اروری میده؟

mosy_m.s
جمعه 24 خرداد 1392, 13:11 عصر
متد "موس اونت" 5 تا ورودی uint داره ولی x و y از نوع int هستند. می گه ناهماهنگه.

mosy_m.s
جمعه 24 خرداد 1392, 13:12 عصر
اصلا این برنامه دقیقا داره چیکار می کنه؟

programerinfonet
جمعه 24 خرداد 1392, 17:03 عصر
یعنی چی؟
من مشکلم همینه دیگه. که کدی بلد نیستم که مثلا بهش یه X و Y بدم، بعد بگم اون نقطه رو کلیک کن.

منظور من این بود که کلیک تو یه مختصات خاص برای اینه که یه کدی اجرا بشه دیگه ؟ خوب همون کد رو فراخوانی کن

mosy_m.s
جمعه 24 خرداد 1392, 19:10 عصر
منظور من این بود که کلیک تو یه مختصات خاص برای اینه که یه کدی اجرا بشه دیگه ؟ خوب همون کد رو فراخوانی کن
نه. این به کارم نمیاد.

ashkan1234
شنبه 25 خرداد 1392, 11:04 صبح
عزیزم این کار رو که هر کسی بلده. این کاری رو که شما کردی فقط بازخوانیه یه متده که کارش کلیک روی یه دکمه است.
شما کلا فرض کن فقط یه دکمه تو برنامه هست به نامه OK که شما هر وقت این رو کلیک کردین یه قسمتی از صفحه فورم (مثلا با مختصات 20:20) کلیک بشه. یعنی بدون این که موس شما توی مختصات 20:20 کلیکی انجام داده باشه، اونجا کلیک بشه.

سلام بلادل!:لبخند:
خسته نباشید!
خدای ناکرده بنده نخواستم به دانسته های شما توهینی کنم!فقط خواستم اگر مقدور باشه کمکی کرده باشم!
فکر میکنم چیزی که شما میخوایید دقیقا با کدی که قرار داده بودم یکی هست!!؟؟:لبخندساده:
خوب شما بلاخره وقتی عمل کلیک رو انجام میدید باید یکاری انجام بشه دیگه!
فقط یکم باید خلاقیت بخرج میدادید و موقعیت کرسر رو خودتون بهش میداید!
حالا با این کد اگه میخوایید میتونید کرسر موس رو هرجا که میخوایید ببرید:
Cursor.Position = new Point(Cursor.Position.X - 150, Cursor.Position.Y - 150);

این کرسر موس را بجایی که میخوایید میبره!حالا مثلا من گفتم 150تا بالا و چپ ببر!
حالا با کد زیر یه شرط گذاشتم که وقتی کرسر توی یه محدوده خاص از فرم بود عمل کلیک روی فرم انجام بشه!
if (Cursor.Position.X == 50 && Cursor.Position.Y <= 150)
{
MessageBox.Show("Test");
}
اینم چک میکنه ببینه روی دکمه کلیک چپ شده یا نه؟
e.Button == MouseButtons.Left
درنتیجه شما اینجوری بنویس ببین همون چیزیو که میخوایید هست؟
private void FrmMain_MouseClick(object sender, MouseEventArgs e)
{
if (Cursor.Position.X == 50 && Cursor.Position.Y <= 150)
{
MessageBox.Show("Test");
}

}

private void btn_MouseClick(object sender, MouseEventArgs e)
{
Cursor.Position = new Point(Cursor.Position.X - 150, Cursor.Position.Y - 150);
if (e.Button == MouseButtons.Left )
{
FrmMain_MouseClick(sender,e);
}
}
راستی اگه کد بالا رو بردی تو سی شارپ دیدی عمل نکرد،ناامید نشو!فقط شرطی که توی Form_Close گذاشتم موقعیت کرسر رو به اونجایی که میخوایی تغییر بده!
موفق باشید!:لبخند:

mosy_m.s
شنبه 25 خرداد 1392, 11:46 صبح
خیلی ممنون ازتون. کلک جالبی بود ولی در هر حال باز هم از کرسر موس استفاده شده. این جوری خیلی غیر عادی می شه که مثلا کاربر یه دکمه ای رو پایین صفحه بزنه بعد یه دفعه کرسر بره بالا.

ashkan1234
شنبه 25 خرداد 1392, 12:10 عصر
خیلی ممنون ازتون. کلک جالبی بود ولی در هر حال باز هم از کرسر موس استفاده شده. این جوری خیلی غیر عادی می شه که مثلا کاربر یه دکمه ای رو پایین صفحه بزنه بعد یه دفعه کرسر بره بالا.
خواهش میکنم!
بلاخره تو اون موقعیت که شما میخوایید کلیک بشه باید یه چیزی باشه دیگه!یه کنترلی یا چیزی!نمیدونم!
ولی فکرکنم با این حال از this.Location کنترل هم بشه یه استفادههایی کرد!و بازهم از این کلک ها بزنید!:لبخند:
یا میتونید اونجا که عمل کلیک قراره انجام بشه از یه پنل کنترل استفاده کنید که با فرم یکرنگ و یک سطح بشه!فکر کنم این بهتره!
راه زیاده فقط باید بدونید دقیقا چه عملی و کجا و چرا باید انجام بشه!
دیگه چیز دیگه ای الان به ذهنم نمیرسه!
موفق باشید!:لبخند:

mosy_m.s
شنبه 25 خرداد 1392, 13:33 عصر
میشه این کاری که شما تو پست قبل گفتید رو بکنم بعد دوباره کرسر موس رو بیارم سر جای قبلیش. البته یه خورده غیر اصولیه ولی خوب چاره کار همینه.

ashkan1234
شنبه 25 خرداد 1392, 14:24 عصر
همونطور که عرض کردم،بنده طبق سوال شما پاسخ دادم!
شما اگه نمیخواهید از کرسر موس استفاده بشه از Location فرم استفاده کن!
یعنی مثلا توی رویداد کلیک فرم شرط بزار اگر Location اون چیزی که میخوای روش کلیک کنی برابر Location ای که الان توش قرار داره یکی شد برو شرط رو اجرا کن!
مثال:گفتم اگر دکمه1 لاکیشنش در فرم =389 شد،مسیج باکس!
private void FrmMain_MouseClick(object sender, MouseEventArgs e)
{

if (button1.Location.X==389)
{
MessageBox.Show("Test");
}

}

private void btn_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
FrmMain_MouseClick(sender, e);
}
}
امیدوارم این بکارتون بیاد!:لبخند:

xvahid
دوشنبه 27 خرداد 1392, 05:34 صبح
متد "موس اونت" 5 تا ورودی uint داره ولی x و y از نوع int هستند. می گه ناهماهنگه.

یه Cast کم داشت. این شکلی بنویس:


[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);

[DllImport("user32.dll")]
static extern bool SetCursorPos(int x, int y);

private const int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04;
private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
private const int MOUSEEVENTF_RIGHTUP = 0x10;

public Form1()
{
InitializeComponent();

MouseDown += (sender, args) => MessageBox.Show(string.Format("form clicked at({0},{1})", args.X, args.Y));
}

public static void LeftMouseClick(int newX, int newY, int previousX, int previousY)
{
SetCursorPos(newX, newY);
mouse_event(MOUSEEVENTF_LEFTDOWN, (uint)newX, (uint)newY, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, (uint)newX, (uint)newY, 0, 0);
SetCursorPos(previousX, previousY);
}

private void button1_Click(object sender, EventArgs e)
{
int X = Location.X + 20;
int Y = Location.Y + 20;
LeftMouseClick(X, Y, Cursor.Position.X, Cursor.Position.Y);
}



بجای X و Y مختصات مورد نظر خودتو بذار. پروژه رو هم برات اتچ کردم.