標籤:rac send entry object int 顯示 操作 event null
近期在做winCE系統的掃描槍應用程式,遇到了一些問題,其中包括消失提示框在手持終端顯示過小,
使用者要求提示框提示幾秒後自動關閉,Windows平台可以通過調用系統API以定時器的方式進行自動銷毀。
不過在winCE上存在不同,由於winCE系統屬於精簡版的windows系統,所以在API上也是屬於精簡後的,
Windows平台銷毀訊息框用user32.dll中的FindWindow和PostMessage完成,而winCE平台並沒有
user32.dll,不過對應的API在coredll.dll中。
windows平台範例程式碼:
1 [DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)] 2 internal static extern IntPtr FindWindow(string className,string windowName); 3 4 [DllImport("user32.dll", EntryPoint = "PostMessage", CharSet = CharSet.Auto)] 5 internal static extern int PostMessage(IntPtr hWnd,int msg,IntPtr wParam,IntPtr lParam); 6 7 internal const int WM_CLOSE = 0x10; 8 Timer timer = new Timer(); 9 10 private void btnAutoCloseMesaage_Click(object sender, EventArgs e)11 {12 runKillTimer();13 MessageBox.Show("操作已完成,可以關閉!","Message");14 }15 16 /// <summary>17 /// 運行timer18 /// </summary>19 internal void runKillTimer()20 {21 timer.Interval = 2000;22 timer.Tick+=timer_Tick;23 timer.Start();24 }25 26 /// <summary>27 /// timer觸發關閉訊息框28 /// </summary>29 /// <param name="sender"></param>30 /// <param name="e"></param>31 private void timer_Tick(object sender, EventArgs e)32 {33 KillMessageBox();34 timer.Stop();35 }36 37 /// <summary>38 /// 調用API尋找表單並關閉39 /// </summary>40 internal void KillMessageBox()41 {42 IntPtr msgPtr = FindWindow(null, "Message");43 if (msgPtr != IntPtr.Zero)44 {45 PostMessage(msgPtr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);46 }47 }
View Code
winCE平台範例程式碼:
1 [DllImport("coredll.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)] 2 internal static extern IntPtr FindWindow(string className,string windowName); 3 4 [DllImport("coredll.dll", EntryPoint = "PostMessage", CharSet = CharSet.Auto)] 5 internal static extern int PostMessage(IntPtr hWnd,int msg,IntPtr wParam,IntPtr lParam); 6 7 internal const int WM_CLOSE = 0x10; 8 Timer timer = new Timer(); 9 10 private void btnAutoCloseMesaage_Click(object sender, EventArgs e)11 {12 runKillTimer();13 MessageBox.Show("操作已完成,可以關閉!","Message");14 }15 16 /// <summary>17 /// 運行timer18 /// </summary>19 internal void runKillTimer()20 {21 timer.Interval = 2000;22 timer.Tick+=new EventHandler(timer_Tick);23 timer.Enabled = true;24 }25 26 /// <summary>27 /// timer觸發關閉訊息框28 /// </summary>29 /// <param name="sender"></param>30 /// <param name="e"></param>31 private void timer_Tick(object sender, EventArgs e)32 {33 KillMessageBox();34 timer.Enabled = false;35 }36 37 /// <summary>38 /// 調用API尋找表單並關閉39 /// </summary>40 internal void KillMessageBox()41 {42 IntPtr msgPtr = FindWindow(null, "Message");43 if (msgPtr != IntPtr.Zero)44 {45 PostMessage(msgPtr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);46 }47 }
View Code
ps:大家有其他好的意見或建議也可以多多交流。
winCE/Windows 應用程式訊息提示框自動消失功能