PDA

View Full Version : سوال: بسته شدن برنامه ...



Ali_Fallah
چهارشنبه 25 دی 1392, 18:57 عصر
با سلام

می خوام اگر کاربر با موس و هر کدام از کلیدهای کیبورد در مدت زمان مشخصی (مثال : 10 دقیقه که در یک تکست مشخص می کنیم ) کار نکردبرنامه بسته بشه
---
ممنون میشم اگه کمکم کنید.

sagggad
چهارشنبه 25 دی 1392, 19:07 عصر
با سلام
شاید راه ساده ای باشه اما این به فکر من رسید که یک تایمر بسازی و Interval رو برابر 1000 قرار بدی و در هنگام فعال شدن فرم(رویداد Activated) تایمر را فعال کنی و یک متغیر Integer نیز به صورت سراسری در قسمت Public Class Form تعریف کنی و اون رو به طور اولیه برابر 0 قرار بدی. در رویداد Timer_Tick کد زیر رو بنویسی(در این جا اسم متغیر IN1 است :


IN1 += 1

حالا با این کار یک ثانیه شمار داریم
خوب شما میتونید در همین رویداد Tick مربوط به تایمر یک شرط if بذارید که اگر IN1 برابر شد با مثلا 600 که میشه 10 دقیقه یک کار خاصی انجام بشه.
حالا در رویداد TextChanged مربوط به تکس باکس هم تایمر رو غیر فعال میکنی...
باز دوباره در TextChanged یه if میذاری که اگر تکس باکس متنش برابر "" بود دوباره تایمر فعال بشه
این چیزی بود که به ذهن من رسید
اگه وقت کنم سورسش رو مینویسم

Mani_rf
چهارشنبه 25 دی 1392, 19:36 عصر
برای اینطور کار ها باید مسیج هایی که به سمت برنامه میاد رو کنترل و فیلتر کنی. هر برنامه یک هندلر داره که یک سری مسیج براش ارسال میشه و شما میتونید این هندلر رو کنتر کنید و اگر تو مدت زمان خاصی فعال نشد و یعنی چیزی به سمتش نیومده و در نتیجه کاری که میخواید رو انجام بده. یکم جستجو کنی در این مورد مطلب توی سایت زیاد هست که میتونه کمکت کنه پیاده سازیش کنی.

sagggad
چهارشنبه 25 دی 1392, 19:44 عصر
برای اینطور کار ها باید مسیج هایی که به سمت برنامه میاد رو کنترل و فیلتر کنی. هر برنامه یک هندلر داره که یک سری مسیج براش ارسال میشه و شما میتونید این هندلر رو کنتر کنید و اگر تو مدت زمان خاصی فعال نشد و یعنی چیزی به سمتش نیومده و در نتیجه کاری که میخواید رو انجام بده. یکم جستجو کنی در این مورد مطلب توی سایت زیاد هست که میتونه کمکت کنه پیاده سازیش کنی.
جناب Mani_rf آدم رو تو تکاپو میندازن
بابا توروخدا یک راست جواب بده استاد...
ما قدرت جستجومون ضعیفه

Mani_rf
چهارشنبه 25 دی 1392, 22:50 عصر
جناب Mani_rf آدم رو تو تکاپو میندازن
بابا توروخدا یک راست جواب بده استاد...
ما قدرت جستجومون ضعیفه

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

مثلا در این مورد خواص اگر درباره هندلر ها چند دقیقه تحقیق کنید متوجه میشید که به چه دلیل به وجود اومده، و چه استفاده هایی که ازشون نمیشه کرد و بعد تازه ماجرا براتون جذاب تر میشه. هم کارتون رو انجام میدید و هم یک مفهوم جدید یاد میگیرید.
خب البته این نکته رو میدونم که این روش برای کسایی که برنامه نویس هستن یا قصد برنامه نویس شدن رو دارن جواب میده و جذابه و کسایی که فقط دونبال جواب میگردن تا کارشون پیش بره خیلی ازش استقبال نمی کنن.
در کل من ترجیح میدم یاد بدم تا انجام بدم.
اگر اشتباه میکنم من رو ببخشید ولی نظر شخصیه من اینه.

Mani_rf
چهارشنبه 25 دی 1392, 23:10 عصر
راهنمایی بیشتر :

توی فرمی که میخواید این کار رو بکنید متد WndProc رو Override کنید. این متد این وظیفه رو به عهده داره که تمامی مسیج هایی که به فرم فرستاده میشه رو میگیره و کاری که لازمه رو روش انجام میده . مثلا وقتی که با موس وارد فرم میشید، ویندوز یک مسیج به فرم میفرسته که میگه الان موس وارد شد، فرم هم مثلا رخداد onMouseEnter رو فراخانی میکنه یا هر وظیفه دیگه ای که داشته باشه.
حالا باید توی این تابع فیلتر کنید که چه میسیج هایی رو میخاید به عنوان عمل روی فرم در نظر بگیرید و چه مسیج هایی رو نمیخاید . طبیعتا یک تایمر البته با ترد ها ایجاد میکنید که تو 1زمان خاصی مثلا هر 2ثانیه فعال میشه و اگه مسیجی که وارد فرم شده با چیزی که شما عمل روی فرم در نظر گرفتید یکی بود تایمر غیر فعال بشه .
اگر مدت زمان خاصی گذشت و تایمر غیر فعال نشد یعنی کاری روی فرم صورت نگرفته و باید اتفاقایی که میخاید بی افته (مثلا برنامه بسته بشه)
فقط میمونه فیلتر کردن پیغام ها که هر عملی برای خودش یک کد داره که با یکم جستجو یا وقت گذاشتن میتونید کد کلیک موس و یا فکوس گرفتن فرم و یا زده شدن کلید کیبرد رو پیدا کنید و به عنوان عمل در نظر بگیرید. مثلا تو این لینک (http://msdn.microsoft.com/en-us/library/windows/desktop/ms646268(v=vs.85).aspx#processing_keystrokes) مایکروسافت برات توضیح داده که مسیج هایی که از طرف کیبورد به فرم میاد چیا هست و تفسیر تک به تکش چیه. تو این لینک (http://msdn.microsoft.com/en-us/library/windows/desktop/ms645602(v=vs.85).aspx)هم همه این چیز ها رو درباره موس گفته.
به همین راحتی.
این هم نمونه Override شده تابع :

Protected Overrides Sub WndProc(ByRef m As Message)
MyBase.WndProc(m)
End Sub

sagggad
پنج شنبه 26 دی 1392, 05:57 صبح
ممنون از توضیحاتتون
من برای این میگم که تو سایت های فارسی کم تر راجع به این مسائل آوزش هست من هم که انگلیسیم در حدی نیست که بتونم راحت سایت مایکروسافت رو برا خودم ترجمه کنم
برا همین گفتم شما لطف کنید و آموزش بدید

Ali_Fallah
یک شنبه 13 بهمن 1392, 21:42 عصر
کد زیر جواب سوال بالاست.

Public Class Form1
Implements IMessageFilter
Public Sub New()
InitializeComponent()
Application.AddMessageFilter(Me)
Timer1.Enabled = True
End Sub
Public Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage

If (m.Msg >= &H100 And m.Msg <= &H109) Or (m.Msg >= &H200 And m.Msg <= &H20E) Then
Timer1.Stop()
Timer1.Start()
End If
End Function
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Timer1.Stop()
Application.Exit()
End Sub
End Class

Ali_Fallah
یک شنبه 13 بهمن 1392, 21:47 عصر
بر روی فرم timer اضافه نموده و interval رو مقداردهی کنید ...