2009-01-30 10 views
3

System.Windows.Forms.Control에서 파생 된 사용자 지정 컨트롤을 작성하고 있습니다.Windows Forms의 경우 PostMessage와 동일합니까?

컨트롤은 Control.KeyDown 이벤트를 사용하여 키 입력을 감시합니다. 단축키로 일부 키 입력 (예 : <Ctrl>-K)을 처리해야하는데, 이로 인해 대화 상자가 시작됩니다. 내 onKeyDown 이벤트 처리기에서 대화를 시작하면 내가 true와 리턴 (그래서 나는 K 키를 누를을 억제하지 못하는거야)에 KeyEventArgs.SuppressKeyPress를 설정하기 전에

대화 상자가 표시됩니다. 대신, onKeyDown 이벤트 핸들러에서 돌아가서 나중에 대화 상자를 시작하고 싶습니다. 이렇게하려면 onKeyDown 이벤트 핸들러에서 돌아온 후에 어떻게 든 '대화 상자 시작'이벤트와 함께 다시 호출해야합니다.

Win32에서 PostMessage API를 사용하여 등록한 창 메시지를 보내면이 이벤트를 생성 할 수 있습니다. 메시지 대기열에있는 이전 메시지 바로 다음에이 메시지가 표시되고이를 실행 신호로 사용합니다. 내 대화. 그러나 여기서는 API (SecurityPermissionFlag::UnmanagedCode 필요 없음)를 엄격하게 사용하기 때문에 PostMessage 함수 (WndProc 메서드도 사용할 수 없음)를 사용할 수 없습니다.

그렇다면 비동기 콜백을 예약하는 스레드 (내 UI 스레드)에 대해 관리되는 동등 물은 무엇입니까? 아마 어떤 종류의 타이머일까요? 어떤 종류의 자기 - Invoke?

답변

3

내 생각에 "전에 대화를 열기 전에 SurpressKeyPress 속성을 설정했습니다."하지만 실제로는 질문에 답하지 않습니다. 대화 상자를 열기 전에 이벤트 처리기에서 실제로 복귀해야하는 경우 BeginInvoke 메소드를 살펴보십시오.

... 
this.BeginInvoke(new InvokeDelegate(showDlg)); 
KeyEventArgs.SuppressKeyPress = true; 
... 


public void showDlg() 
{ 
    // create and show dialog here 
} 
+0

감사합니다. 나는 컨트롤의 BeginInvoke 호출 자체가 동기화 호출을 초래할 것이라고 잘못 가정했다. – ChrisW

+0

@JimHarte 여기 InvokeDelegate는 .NET 프레임 워크의 대리자이거나 자신을 선언해야하나요? –

+0

@AgnelKurian 나만의. http://msdn.microsoft.를 참조하십시오.com/ko-ko/library/0b1bf3y3 % 28v = 예를 들어 vs.110 % 29.aspx. –

0

양식에 정의 된 메서드에서 대화 상자를 시작하고 새 스레드 (using 문에 System.Threading 포함)에서 메서드를 시작할 수 있습니다. 버튼 클릭 이벤트의 코드는 다음과 같습니다.

Thread thread = new Thread(new ThreadStart(LaunchDialog)); 
thread.Start(); 

여기서 LaunchDialog는 새 대화 상자 창을 시작하는 메소드입니다.

+0

내가 대화 상자가 모달되고 싶지 : 부모 창을 비활성화하고이 기각 될 때까지 모든 키 입력을 얻을 수

당신이 뭔가를 할 수 있습니다. 단일 스레드 UI를 여러 스레드에서 구동하는 것에 대해 불안합니다. 나는 대개 UI 스레드를 가지고 있으며, UI를 건드리지 않는 작업자 스레드가 있습니다. 당신의 제안은 안전하다고 생각하십니까? – ChrisW

+0

아니, 제 생각은 좋은 생각이 아닙니다. 내가해야 할 때까지 결코 쓰레드를 사용하지 않으며, 내가해야 할 일은 극히 드물다. 왜 당신은 단지 클릭 이벤트에서 모달 대화 상자를 시작하고 사용자가 상호 작용하게하고 대화 상자를 닫을 수 없는지 저는 이해가 가지 않습니다. – MusiGenesis

+0

우리가 만족스럽지 않으면이 답변을 삭제할 수 있습니까? – Aardvark

관련 문제