我发现如何在我的Windows Mobile应用程序中禁用“确定”按钮(通过将ControlBox
设置为 false )。
我遇到的问题是我可以通过按下“确定”按钮关闭我的应用程序,但FormClosing,FormClosed事件没有被触发,最令人担心的是,表单的Dispose()方法也没有被调用。这使得清理线程和其他资源等事情变得非常困难。
现在我可以强制用户使用我自己的“退出”按钮,这些方法都按照我的预期执行。
问题:为什么Windows Mobile应用程序中的“确定”按钮会在绕过我提到的方法时关闭应用程序?
答案 0 :(得分:0)
当您为FormClosing
和FormClosed
事件编写代码时,您是否记得将实际表单连接起来使用这些代码?
我有一些我维护的Windows Mobile应用程序,他们调用我为他们创建的方法。
我经常忘记将控件设置为使用我为他们编写的代码,这是我想到的第一件事。
编辑:我不使用微软的OK
按钮,而是使用具有退出菜单项的菜单。
在主程序执行之前,我还通过P /调用Program.cs
文件中的“coredll”文件来关闭软输入面板(SIP)和任务栏。
这可能是您的解决方案。如果是这样,这应该是我用于此的所有代码。一定要测试一下,如果缺少某些东西,请告诉我,我会更新它。
const string COREDLL = "coredll.dll";
[DllImport(COREDLL, EntryPoint = "FindWindowW", SetLastError = true)]
public static extern IntPtr FindWindowCE(string lpClassName, string lpWindowName);
[DllImport(COREDLL, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
private static Form1 objForm = null;
private static IntPtr _taskBar = IntPtr.Zero;
private static IntPtr _sipButton = IntPtr.Zero;
[MTAThread]
static void Main() {
ShowWindowsMenu(false);
try {
objForm = new Form1();
Application.Run(objForm);
} catch (Exception err) {
objForm.DisableTimer();
if (!String.IsNullOrEmpty(err.Message)) {
ErrorWrapper("AcpWM5 Form (Program)", err);
}
} finally {
ShowWindowsMenu(true); // turns the menu back on
}
}
private static void ShowWindowsMenu(bool enable) {
try {
if (enable) {
if (_taskBar != IntPtr.Zero) {
SetWindowPos(_taskBar, IntPtr.Zero, 0, 0, 240, 26, (int)WindowPosition.SWP_SHOWWINDOW); // display the start bar
}
} else {
_taskBar = FindWindowCE("HHTaskBar", null); // Find the handle to the Start Bar
if (_taskBar != IntPtr.Zero) { // If the handle is found then hide the start bar
SetWindowPos(_taskBar, IntPtr.Zero, 0, 0, 0, 0, (int)WindowPosition.SWP_HIDEWINDOW); // Hide the start bar
}
}
} catch (Exception err) {
ErrorWrapper(enable ? "Show Start" : "Hide Start", err);
}
try {
if (enable) {
if (_sipButton != IntPtr.Zero) { // If the handle is found then hide the start bar
SetWindowPos(_sipButton, IntPtr.Zero, 0, 0, 240, 26, (int)WindowPosition.SWP_SHOWWINDOW); // display the start bar
}
} else {
_sipButton = FindWindowCE("MS_SIPBUTTON", "MS_SIPBUTTON");
if (_sipButton != IntPtr.Zero) { // If the handle is found then hide the start bar
SetWindowPos(_sipButton, IntPtr.Zero, 0, 0, 0, 0, (int)WindowPosition.SWP_HIDEWINDOW); // Hide the start bar
}
}
} catch (Exception err) {
ErrorWrapper(enable ? "Show SIP" : "Hide SIP", err);
}
}