2012-06-26 3 views
2

가 나는 내 윈도우 모바일 응용 프로그램 (ControlBox 거짓 로 설정하여) "OK"버튼을 비활성화하는 방법을 을 발견했습니다.윈도우 모바일 'OK'버튼을

문제는이 "확인"버튼을 눌러 애플리케이션을 닫을 수 있었지만 FormClosing, FormClosed 이벤트가 발생하지 않았으며 가장 걱정 스럽지만 양식의 Dispose() 메소드가 호출되지 않았습니다. 어느 한 쪽. 이로 인해 스레드 및 기타 리소스와 같은 항목을 정리하는 것이 매우 어려웠습니다.

이제 사용자가 내 "종료"버튼을 사용하도록 강제 할 수있게되었으므로 해당 메소드가 모두 예상대로 실행됩니다.

질문 : Windows Mobile 응용 프로그램의 "확인"단추를 사용하면 내가 언급 한 방법을 무시하면서 응용 프로그램을 닫을 수 있습니까?

+0

'확인'버튼이나 'X', 'IIRC'버튼을 누르면 응용 프로그램이 닫히지 않고 숨겨진 것입니다. 다시 실행하면 다시 가져옵니다. 위로. 나는 '확인'버튼이 대화창 창에만 표시되었다고 생각합니다. – Matt

+0

IIRC <- 버튼은 실제로 앱 또는 앱의 현재 창을 닫습니다. –

+0

"확인"버튼입니다. 내 응용 프로그램은 모달이 아닙니다. –

답변

0

FormClosingFormClosed 이벤트에 대한 코드를 작성할 때 실제 양식을 연결하여 사용했는지 기억해 둡니까?

필자는 내가 유지 관리하는 몇 가지 Windows Mobile 응용 프로그램을 가지고 있으며이를 위해 만든 메서드를 호출합니다.

내가 자주 작성한 코드를 사용하도록 컨트롤을 설정하는 것을 잊어 버렸다. 그래서 내가 생각한 첫 번째 것이었다.

편집 : Microsoft의 OK 버튼을 사용하지 않고 EXIT 메뉴 항목이있는 메뉴를 사용합니다.

Wm5 in GUI

나는 또한 내 주요 프로그램을 실행하기 전에 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); 
    } 
} 
+0

예, 이벤트가 연결됩니다. Close()를 사용하여 양식을 닫으면 제대로 실행됩니다. –

+0

그래서 Windows Mobile이 전달할 수있는 것은 아무 것도 발사하지 않는 Microsoft의 작은 OK 단추입니다. 나는 당신에게 "풀려나 게"할 수있는 몇 가지 변화를 만들었습니다. – jp2code

+0

이제는 'ControlBox = false' 설정의 OK 버튼을 숨겼으므로 더 이상 문제가되지 않습니다. 내 질문은이 문제를 일으키는 상황과 관련이 있습니다. 나에게 이것은 사용자가 실제로 프로그램을 닫지 않고 프로그램을 겉으로보기에는 닫을 수있게하는 주요 UI 실수로 보인다. 위의 Matt의 의견은 좋은 대답 일 것 같습니다 .- 확인은 창을 숨 깁니다. 전에는이 플랫폼을 사용 해보지 않았고 동일한 버튼에서 X 버튼을 기대하는 OK 버튼을 보았습니다. 어디서 혼란 스러울 지 알 수 있습니다. –

관련 문제