2

Windows Mobile アプリケーションで [OK] ボタンを無効にする方法を発見しました ( falseControlBoxに設定することにより)。

私が抱えていた問題は、この「OK」ボタンを押してアプリケーションを閉じることができたのですが、FormClosing、FormClosed イベントが発生せず、最も心配だったのは、フォームの Dispose() メソッドも呼び出されなかったことです。これにより、スレッドやその他のリソースなどをクリーンアップすることが非常に困難になりました。

ユーザーに独自の「終了」ボタンの使用を強制できるようになったので、これらのメソッドはすべて期待どおりに実行されます。

質問: Windows Mobile アプリケーションの [OK] ボタンを押すと、前述の方法をバイパスしてアプリケーションが閉じてしまうのはなぜですか?

4

1 に答える 1

0

FormClosingandイベントのコードを書いたとき、FormClosedこれらを使用するために実際のフォームを配線することを覚えていましたか?

私が管理しているWindowsMo​​bileアプリケーションがいくつかあり、それらは私が作成したメソッドを呼び出します。

自分が書いたコードを使用するようにコントロールを設定するのを忘れることがよくあるので、それが最初に考えたものでした。

編集:私はMicrosoftのボタンを使用しませんOKが、代わりにEXITメニュー項目を持つメニューを使用します。

GUIのWm5

Program.csまた、メインプログラムを実行する前に、ファイル内の「coredll」ファイルをP /呼び出して、ソフト入力パネル(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);
  }
}
于 2012-06-26T13:55:32.420 に答える