PDA

View Full Version : سوال: مشاوره در مورد استفاده از هوك!(داغون حياتيه)



mahboube
یک شنبه 28 شهریور 1389, 12:08 عصر
سلام دوستان
من توي يك مساله شديده به مشكل برخوردم و واقعا به هلپ(مشاوره) نياز دارم!!
من از فرايند هوك استفاده مي كن براي ايجاد اونت براي پنجره مينيمم شده ولي حالا بعد كلي وقت گذاشتن فهميدم اساسا مشكل دارم!
1-مشكل اول اينكه دارم روي mousemove كار مي كنم و تازه فهميدم دستورايي كه مينويسم بيشتر از n بار اجرا ميشن!كه اين يعني فاجعه!!
2-دليلي كه از هوك استفاده كردم اين بود كه مي خواستم روي پنجره مينيمم شده ايونت داشته باشم ودر حالت عادي نداشت!
3-چون دارم از يك فرم مستر استفاده مي كنم كه ممكنه چندتا چيلد داشته باشه بنابراي فرمي كه دستورات اجراي هوك رو توش نوشتم فرم مسترمه و توي اين فرم پوزيشن فرم هاي چيلد رو بررسي مي كنم هروقت موس روشون قرار گرفته باشه دستوراته مربوط به اون فرم اجر ميشه(يكي از دوستان گفته بررسي كنم ببينم شي كه داره ايونت از طريق هوك بهش داده ميشه همون شي كه من ميخام هست يا نه كه نتونستم(يعني روش كار نكردم) اگر كسي در اين مورد چيزي بدونه ممنون ميشم بگه.(اينكه چطوري بفههمم الان ايونتم روي كدوم شي اجرابشه و يا اينكه بعداز اجرا شدن روي كدوم شي اجرا نشه) و اصلا اينكه اگر نخام كاري كه گفتم رو بدون بررسي پوزيشن ها انجام بدم چيكار بايد بكنم(يعني غير از اين چطويري مي تونم رويداد رو به يك پنجره بدم؟؟)

هر نظري،مشورتي،لينكي و...مفيد خواهد بود و من ممنون خوام شد!!!
اگر درمورد سوالم سوالي ،كدي چيزي هم خواستيد در خدمتم.
با سپاس قبلي
اينم يك لينكه كه در مورد همين مساله بحث شده!!
http://barnamenevis.org/forum/showthread.php?t=246676

fjm11100
یک شنبه 28 شهریور 1389, 12:39 عصر
این لینک را ببین اگر کمکت نکرد دقیق و ریز بگو چی میخوای یک نمونه کد برات بنویسم
--------------------
http://www.daniweb.com/forums/thread290467.html
http://www.codeproject.com/KB/DLL/EasyHook64.aspx

fjm11100
یک شنبه 28 شهریور 1389, 12:48 عصر
راستی سایت اول لینک دانلودش sourceforge است باید با پ.ر.و.ک.س.ی بری که اجازه دانلود بده

mahboube
یک شنبه 28 شهریور 1389, 12:55 عصر
ممنون.
ببين اين برنامه منه..كلافم كرده!حال خوندن لينكام ديگه ندارم!!!(يعني وقتشوندارم)
لطفا اجراش كن Butn2 رو كليك كن فرمابازشن.بعدروشون Mousemove كن.ببين براي پياده سازي بهترش چيزي به ذهنت ميرسه؟
ممنون.

mahboube
یک شنبه 28 شهریور 1389, 13:36 عصر
این لینک را ببین اگر کمکت نکرد دقیق و ریز بگو چی میخوای یک نمونه کد برات بنویسم
--------------------
http://www.daniweb.com/forums/thread290467.html
http://www.codeproject.com/KB/DLL/EasyHook64.aspx

اينارو ديدم ولي راسيتش نفهميدم!!
مشكل من اينه كه mousemove دايم داره اجرا ميشه و فكر ميكنم براي سرعت اجراي برنامه خيلي بده!!!
بنظرشما مشكل پيش مياد!اگرنخام از x,y استفاده كنم چه راه ديگه اي دارم؟

fjm11100
یک شنبه 28 شهریور 1389, 14:12 عصر
تنبل خان ChildWindowFromPoint بهت هندل پنجره را از موقعیت x و y که از هوک ماوس بدست آوردی میده(اگر پنجره ای باشه اگر نه که null میده)
بعد می تونی با GetWindowText عنوان اون پنجره را بدست بیاری (اگر لازمش داری)
این دو تابع دقیقا مثل GetWindowRect که اول فرم1 نوشتی تعریف میشن ChildWindowFromPoint هندل فرم پدر و پوینت موقعیت را میگیره
--------------------
مدام خوانده شدن mousemove اشکالی نداره تو شرطها را اول چک کن اگر پنجره بود (یعنی تابعی که گفتم null بر نگردوند) متد را اجرا کنه

mahboube
یک شنبه 28 شهریور 1389, 14:54 عصر
تنبل خان ChildWindowFromPoint بهت هندل پنجره را از موقعیت x و y که از هوک ماوس بدست آوردی میده(اگر پنجره ای باشه اگر نه که null میده)
بعد می تونی با GetWindowText عنوان اون پنجره را بدست بیاری (اگر لازمش داری)
این دو تابع دقیقا مثل GetWindowRect که اول فرم1 نوشتی تعریف میشن ChildWindowFromPoint هندل فرم پدر و پوینت موقعیت را میگیره
--------------------
مدام خوانده شدن mousemove اشکالی نداره تو شرطها را اول چک کن اگر پنجره بود (یعنی تابعی که گفتم null بر نگردوند) متد را اجرا کنه

آقا اينكه برا همه فرما يك هندل رو برمي گردونه!!!يعني فقط هندل فرم مسترو!!!نفهميدم چي بود منظورت!!!من اين شكلي نوشتم:





[DllImport("user32.dll")]
static extern IntPtr ChildWindowFromPoint(IntPtr hWndParent, Point Point);
-------

private void MouseMove1(object sender, MouseEventArgs e)

...{

MX = e.X;
MY = e.Y;
....
Point pt = new Point(MX, MY);
IntPtr actvchdhwnd = ChildWindowFromPoint(this.Handle, pt);
textBox2.Text = actvchdhwnd.ToString();

mahboube
یک شنبه 28 شهریور 1389, 15:47 عصر
نه درست شد.هندلو درست برميگردونه ولي هنوزم در مورد mousemove و سرعت شك دارم!

fjm11100
یک شنبه 28 شهریور 1389, 16:16 عصر
شک نکن این لازمه. کافیه کمترین کدها را قبل از اطمینان اینکه موس جای مناسب هست یا نه را بنویسی روی نوشتن شرطها و حتی ترتیب شرطها دقت کن از شرطهای && یا || به جای & و | استفاده کن
اگه کارت راه افتاد خبرشو بده خوشحال میشم

mahboube
یک شنبه 28 شهریور 1389, 16:49 عصر
شک نکن این لازمه. کافیه کمترین کدها را قبل از اطمینان اینکه موس جای مناسب هست یا نه را بنویسی روی نوشتن شرطها و حتی ترتیب شرطها دقت کن از شرطهای && یا || به جای & و | استفاده کن
اگه کارت راه افتاد خبرشو بده خوشحال میشم
مرسي بابا،خيلي باحالي.باشه حتما مي خبرم،(شبيه خداحافظي شد!!!نخيرشم من هنوز كلي سوال دارم:خجالت:).
مرسي رفيق.
يه سوال ديگم دارم:تو برنامه كه گذاشتم موقعي كه موس روي فرما حركت مي كنه ،وقتي ميره راست فرما درست باز مي شن وليبراي حركت طرف چپ مثل اينكه قاطي مي كنه الان ايونتو به كدوم بده!!!)جالبه نميدونم چرا ؟چه فرقي مي كنه بين راست و چپ؟والا من كه هرچي چك مي كنم نميفهمم چه اتفاقي داره ميفته!!!

ممنون.

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

mahboube
دوشنبه 29 شهریور 1389, 09:55 صبح
دستور if م اينطوريه:



for (int i = 0; i < childcount; i++)
{
IntPtr actvchdhwnd = this.Handle;
Point pt = new Point(MX, MY);
actvchdhwnd = ChildWindowFromPoint(this.Handle, pt);
frmactivechild = this.MdiChildren[i];
if (GetWindowText(activeChild.Handle, sb, sb.Capacity) != 0)
{
textBox2.Text = sb.ToString();
textBox3.Text = activeChild.Name.ToString();
rct = getXY(frmactivechild);
if (e.X >= rct.Left && e.X <= rct.Right && e.Y >= rct.Top && e.Y <= rct.Bottom)
{
if (frmactivechild.WindowState == FormWindowState.Minimized)
{
frmactivechild.Text = frmactivechild.Name + i.ToString();
textBox3.Text = rct.ToString();
textBox2.Text = frmactivechild.Name;
frmactivechild.WindowState = FormWindowState.Normal;
frmactivechild.SetBounds(rct.Left - this.Left - 5, rct.Top - this.Top - frmactivechild.Height, frmactivechild.Width, frmactivechild.Height - 1);
}
}
else if (frmactivechild.WindowState == FormWindowState.Normal)
{
frmactivechild.Text = frmactivechild.Name + " ";
textBox5.Text = frmactivechild.Name;
frmactivechild.WindowState = FormWindowState.Minimized;
frmactivechild.Focus();
}
}
}

mahboube
دوشنبه 29 شهریور 1389, 10:32 صبح
تازه فهميدم به خاطر child هاي Mdiparrent م،يعني اينارو به ترتيب ايندكس(به خاطر Forم)باز ميكنه و چون index فرم بعدي تو نمايش بعدازايندكسه فرم قبليشه مياد توي for فرم قبلي رو اكتيو مي كنه!!!(به خاطراستفاده از mousemove).كسي راه حلي نداره؟؟!!!!چطوري با چه شرطي مي تونم اجراي تابع موس موو رو كنترل كنم؟؟!!!
چطوري ميشه اهي chid هاي active يك فرم parrent رو بدست آورد؟
ممنون

mahboube
دوشنبه 29 شهریور 1389, 13:35 عصر
:تشویق:آفرين به خودم:تشویق:
حل شد.بايد جلوي تلاقي دوتافرم رو بگيريم.كافيه محدوده (براي دادن هوك)به هر فرم رو يكم كم كنيم.(فقط از چپم كافيه!)
در واقع تو دستور if بايد نوشت:



if (e.X >=( rct.Left +10) && e.X <= rct.Right && e.Y >= rct.Top && e.Y <= rct.Bottom)

حامد فراست
دوشنبه 29 شهریور 1389, 18:30 عصر
با سلام
آقا این هوک یعنی چه به چه درد میخوره:متفکر::گیج:

mahboube
سه شنبه 30 شهریور 1389, 08:44 صبح
با سلام
آقا این هوک یعنی چه به چه درد میخوره:متفکر::گیج:

نقل قول از:fjm11100

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

تو اين لينك بحث شده:
http://barnamenevis.org/forum/showthread.php?t=246676

mahboube
سه شنبه 30 شهریور 1389, 10:18 صبح
:تشویق:آفرين به خودم:تشویق:
حل شد.بايد جلوي تلاقي دوتافرم رو بگيريم.كافيه محدوده (براي دادن هوك)به هر فرم رو يكم كم كنيم.(فقط از چپم كافيه!)
در واقع تو دستور if بايد نوشت:




if (e.X >=( rct.Left +10) && e.X <= rct.Right && e.Y >= rct.Top && e.Y <= rct.Bottom)


البته اين خيلي راه اصولي نيست!!(ولي ومن چيز ديگه اي به ذهنم نرسيد!!كسي نظري داشت ممنون ميشم).
يه سوال ديگه:من اگر بخوام بگم توي محدوده هوك رو بده ولي اگر تو اون محدوده دكمه اي وجود داشت ايونت رو از دكمه نگيره!!يعني دكمه كار خودشو بكنه راهي داره؟؟؟(يا اينكه دوبار بايد اندازه بدم؟؟!!!)

fjm11100
سه شنبه 30 شهریور 1389, 13:20 عصر
اندازه نمیخواد باید جنس شی را تشخیص بدی.
بلاخره پیدا کردم :تشویق: برو اینجا http://mwinapi.sourceforge.net/
توش هم سورس نمونه هست هم داکیومنت هم کتابخانه های کار با api که هوک هم داره
راستی کارت درسته از همتت خوشم میاد.

mahboube
سه شنبه 30 شهریور 1389, 13:44 عصر
ممنون.ولي رئيس!ميگه راه ساده تر داره!
ببين ميخوام يه چيزايي كه تو ويندوز هست مثلا حالتي كه پنجره ها تو سون مينيمم مي شن رو پياده كنم.(ميخام بدونم ويندوز چيكار ميكنه،فرمارو كجا نگه مي داره ...)
بحث بعدي ين لينكس:
http://barnamenevis.org/forum/showthread.php?t=248257
خوشحال ميشم اگر شركت كني.ممنون.