PDA

View Full Version : سوال: خروج از messagebox با thread



titipop1
شنبه 03 مرداد 1394, 21:50 عصر
درود دوستان
میخوام با نمایش یه کادر پیغام بعد از یک ثانیه کادر پیغام بسته بشه البته جتما با ترد باشه
مرسی

titipop1
شنبه 03 مرداد 1394, 23:10 عصر
دوستان برنامه نویس پیشنهادی ندارن؟

reza_ali202000
شنبه 03 مرداد 1394, 23:48 عصر
یه تایمر بزار که هر از یک ثانیه اجرا بشه. شروع به کارش زمان نمایش پیغام باشه. و توی خودش نیز اینیبلش فالس بشه که فقط یه بار اجرا بشه. تردد رو هم توی همین تایمر فرابخون.

محمد رضا فاتحی
یک شنبه 04 مرداد 1394, 07:25 صبح
شما باید یه جعبه پیغام سفارشی طراحی کنید...یه دوستی داریم تو همین سایت اسمشون آقا قاسمه تو یکی از تاپیکهاش جعبه پیغام که شما می خواین داره...

ژیار رحیمی
یک شنبه 04 مرداد 1394, 08:21 صبح
سلام اینم کلاس کار

public class AutoClosingMessageBox
{
System.Threading.Timer _timeoutTimer;
string _caption;
AutoClosingMessageBox(string text, string caption, int timeout)
{
_caption = caption;
_timeoutTimer = new System.Threading.Timer(OnTimerElapsed,
null, timeout, System.Threading.Timeout.Infinite);
MessageBox.Show(text, caption);
}
public static void Show(string text, string caption, int timeout)
{
new AutoClosingMessageBox(text, caption, timeout);
}
void OnTimerElapsed(object state)
{
IntPtr mbWnd = FindWindow(null, _caption);
if (mbWnd != IntPtr.Zero)
SendMessage(mbWnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
_timeoutTimer.Dispose();
}
const int WM_CLOSE = 0x0010;
[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
}


نحوه فراخوانی بدین صورت

private void button1_Click(object sender, EventArgs e)
{
AutoClosingMessageBox.Show("Text", "Caption", 1000);

}


منبع کد سایت stackoverflow.com

titipop1
یک شنبه 04 مرداد 1394, 20:14 عصر
سلام اینم کلاس کار

public class AutoClosingMessageBox
{
System.Threading.Timer _timeoutTimer;
string _caption;
AutoClosingMessageBox(string text, string caption, int timeout)
{
_caption = caption;
_timeoutTimer = new System.Threading.Timer(OnTimerElapsed,
null, timeout, System.Threading.Timeout.Infinite);
MessageBox.Show(text, caption);
}
public static void Show(string text, string caption, int timeout)
{
new AutoClosingMessageBox(text, caption, timeout);
}
void OnTimerElapsed(object state)
{
IntPtr mbWnd = FindWindow(null, _caption);
if (mbWnd != IntPtr.Zero)
SendMessage(mbWnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
_timeoutTimer.Dispose();
}
const int WM_CLOSE = 0x0010;
[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
}


نحوه فراخوانی بدین صورت

private void button1_Click(object sender, EventArgs e)
{
AutoClosingMessageBox.Show("Text", "Caption", 1000);

}


منبع کد سایت stackoverflow.com
مهندس جان این کد عالیه فقط واسه من یه ایراد داره اونم اینه که بعد از بسته شدن کادر پیغام فرم هم بسته میشه میشه بفرمایید چه تغییراتی بدم که فرم باز بمونه؟

ژیار رحیمی
دوشنبه 05 مرداد 1394, 00:02 صبح
من تست کزدم بعد گذاشتم مشکلی نداره .مشکل زمانیه که دو بار پشت سر هم رویداد کلیک رو فراخوانی بکنی form فراخوانی هم بسته میشه اینم به واسطه اینه که هنوز Thread کامل از حافظه خارج نشده .اگه با فاصله زمانی کلیک کنی مشکلی نداره.اگه به نتیجه دلخواه نرسیدی به پیشنهاد من در مجموعه کنترل های شرکت Telerik یه کنترل مسیج باکس داره که همون کاری که الان میخوای با Thread انجام بدم فراهم کرده و خیلی آسونه استفاده کردنش.الان مشکل از کد نویسی نداره که من اصلاح کنم.

titipop1
دوشنبه 05 مرداد 1394, 09:10 صبح
من تست کزدم بعد گذاشتم مشکلی نداره .مشکل زمانیه که دو بار پشت سر هم رویداد کلیک رو فراخوانی بکنی form فراخوانی هم بسته میشه اینم به واسطه اینه که هنوز Thread کامل از حافظه خارج نشده .اگه با فاصله زمانی کلیک کنی مشکلی نداره.اگه به نتیجه دلخواه نرسیدی به پیشنهاد من در مجموعه کنترل های شرکت Telerik یه کنترل مسیج باکس داره که همون کاری که الان میخوای با Thread انجام بدم فراهم کرده و خیلی آسونه استفاده کردنش.الان مشکل از کد نویسی نداره که من اصلاح کنم.
مهندس جان در کل زحمت کشیدین دستت درد نکنه خودم یه کم روش کار میکنم ببینم میشه درستش کرد

ژیار رحیمی
دوشنبه 05 مرداد 1394, 10:56 صبح
من یه باز دیگه تست کردم دوست عزیز مشکل حل شد . اولا caption که برای مسیج باکس ست میکنی حتما باید بصورت انگلیسی باشه چون براس نام Caption نام پنجره رو جستجو میکنه. بعد زمانی که روی دکمه ok مسیج باکس کلیک میکنی form اصلی که اونو فراخوانی کرده میبنده به دلیل اینه که نام caption مسیج باکس با نام Form یکی هست

titipop1
دوشنبه 05 مرداد 1394, 15:46 عصر
من یه باز دیگه تست کردم دوست عزیز مشکل حل شد . اولا caption که برای مسیج باکس ست میکنی حتما باید بصورت انگلیسی باشه چون براس نام Caption نام پنجره رو جستجو میکنه. بعد زمانی که روی دکمه ok مسیج باکس کلیک میکنی form اصلی که اونو فراخوانی کرده میبنده به دلیل اینه که نام caption مسیج باکس با نام Form یکی هست
مهندس اون شروطی که فرمودین رعایت کردم متاسفانه بازم جواب نداد کپشن رو تغغیر دادم البته انگلیسی و با فرم من نیر همنام نیست و در ضمن روی ok پیغام هم کلیک نمیکنم
شما توی کلاس تغییراتی اعمال کردین گه واستون جواب میده یا همین کلاسه که گذاشتین

ژیار رحیمی
چهارشنبه 07 مرداد 1394, 03:53 صبح
دوست عزیز کدی که گذاشتم چند بار تست کردم هیچ مشکلی نداره .یه trace بگیر نقطه خروجی تابع رو پیدا کن ببین مشکل از کجاس چرا رو سیستم تو عملکرد متفاوتی داره

titipop1
چهارشنبه 07 مرداد 1394, 22:07 عصر
دوست عزیز کدی که گذاشتم چند بار تست کردم هیچ مشکلی نداره .یه trace بگیر نقطه خروجی تابع رو پیدا کن ببین مشکل از کجاس چرا رو سیستم تو عملکرد متفاوتی داره
مهندش جان درست شد مرسی ایراد از قسمت user32.dll بود که رفع شد بازم ممنون خیلی کمک کردین