루프안에서 윈도우메세지처리에 C++과 C#의 차이점 질문드립니다

안녕하세요 C# 어플리케이션을 새로 개발하면서 기존에
c++에서 쓰이던 기능을 c# winform에서 구현하고자 하는데 해당부분을 구현도중 궁금증이 생겼습니다
아래와 같은 기능이 System.Windows.Forms.Application.DoEvents(); 와 동일하게 동작하는지 궁금합니다!
전체적인 맥락은 사인패드에서 확인 취소등 어떤걸 선택하는지 반복문을 돌면서 기다리는 동안
메세지 처리를 구현하는것입니다.
같은 동작을 기대하기 힘들다면… PInvoke를 통해 PeekMessage , translate등을 가져와서 똑같이 구현하거나
사인패드 입력동안 this.enabled 를 이용해 사용자가 폼에 입력을 못하도록 막아서 구현해볼 생각입니다.

질문 정리하겠습니다.

  1. c++소스와 c#소스가 같은 동작을 기대해도 될까요?
  2. 기대하기 어렵다면 PInvoke를 이용하거나 enabled로 폼을 막는방법도 괜찮을까요?

C++

MSG msg;
BOOL bLoop = TRUE;
while (bLoop)
{
                     // 사용자가 어떤 버튼 선택했는지 확인하는 API , nRtn값 리턴
                    if (nRtn == 1 || nRtn == 3) // 확인이나 취소일 경우
                    {
                            bLoop = false;
                     }
                    while(PeekMessage(&msg, NULL , 0, 0, PM_REMOVE)) //사인입력도중 입력된 메세지들 처리
                      {
                            if (msg.Message == WM_QUIT)
                                {
                                        bLoop = fasle;
                                }
                                TranslateMessage(&msg);
                                DispatchMessage(&msg);
                        }   
 }

~이후 사용자선택에 따라 처리

C#

bool bLoop = true;
while (bLoop)
        {
                     // 사용자가 어떤 버튼 선택했는지 확인하는 API , nRtn값 리턴
                    if (nRtn == 1 || nRtn == 3) // 확인이나 취소일 경우
                    {
                            bLoop = false;
                     }
                    System.Windows.Forms.Application.DoEvents(); //사인입력도중 폼에 입력된 메세지들 처리

        }

~이후 사용자선택에 따라 처리

1개의 좋아요

글에 코드를 삽입할 때는
C의 경우
```c
C 코드 삽입
```
C#의 경우
```csharp
C# 코드 삽입
```
해서 넣으시면 가독성이 좋아집니다. 삽입할 때 탭 등도 고려해서 삽입하면 보기가 더 좋겠습니다.

1개의 좋아요

앗 게시판이용을 처음해봐서 잘 몰랐네요. 감사합니다

2개의 좋아요

정성태님 블로그에도 글 적으신걸 봤는데요.
애초 원 코드가 일반적인 처리방식이 아닙니다.
그걸 C#으로 그대로 옮기는 이유를 모르겠네요.

원코드를 예측하자면 dll?의 API내에서 루프를 돌면서 사인을 완료하기를 기다리는 코드로 보이는데요.
메시지펌프를 수동으로 하는 이유도 UI업데이트나 기타 이벤트 처리를 하기 위함이지 싶거든요?

만약 제 예상이 맞다면 원코드를 좀 더 분석을 하셔서 사인 완료 후 어떠한 이벤트(완료/취소)가
들어오면 처리하는것이 맞지 않을까 생각이 드네요.

C#의 System.Windows.Forms.Application.DoEvents() 메서드도
내부적으론 PeekMessage Win API 함수를 사용하고 있습니다.

뭐 해당 함수 처리 이외에 기타 다른 작업도 하겠지만

이 질문에서는 같은 동작이라고 답변해도 될 것 같습니다.

이 부분은 가장 간단하게 처리 하려면 그냥 새로운 모달 윈도우로 띄워서 사용자 입력을 받으시면 됩니다.
그러면 메세지루프 처리는 별도 고려하지 않아도 될 것 같습니다.

실제 해당 코드로 처리 했을때 잘 안되는 이슈가 있는것인가요?
아님 그냥 궁금해서 질문을 하신건가요?

사인을 하는 와중에 폼(이전엔 웹) 을 클릭하거나 옮기는 등의 행위를 할 경우
응답없음으로 전환되고 한두번까진 괜찮은데 클릭등이 여러번 누적되면 사인이 완료되고 난 후에
그대로 응답없음으로 프로그램이 죽어버립니다. 그래서 다른 게시글도 살피던 도중
loop에서 윈도우메세지가 쌓였다가 한번에 처리될 경우 문제가 된다고 봐서
해당 부분을 넣은 것으로 이해하고 있습니다…
말씀하신 완료취소등의 결과는 버튼체크함수호출하면 int값으로 사용자선택에 따라 값을 반환해줘서
위 소스 이후 부분에서 처리하고있습니다

1개의 좋아요

질문 내용과 다른 관점에서,

사인패드의 입력 값은 아마도 시리얼 통신(혹은 다른 통신 방식 포함)을 통해 수신을 할 텐데요,
사인패드와의 명령어를 주고 받는 것은 별도의 스레드(또는 비동기)에서 처리를 하고,
그 결과를 화면에 표현하는 구조가 더 좋을 것 같은데요.

이렇게 접근하는것은 어려우실까요?

1개의 좋아요

답변 감사합니다^^
윈폼에서 버튼을 누르면 연결된 패드에 입력화면이 뜨는데
위 처리과정없이 입력화면이 떴을 때 윈폼창을 클릭하거나 창을 옮기는 경우 응답없음이 되고 몇번 누적될 경우
사인을 완료한 이후에 프로그램이 먹통이 되었습니다.
해당 부분을 찾아보니 루프 안에서 윈도우메세지가 여러개 누적됬다가 한번에 처리될 경우에 문제가 되서
위와 같은 처리를 한것으로 이해했습니다.
DoEvents 사용 시 문제는 없는데 이걸로 대체해도 되는지 확신이 안서서 질문을 드렸습니다
다시한번 답변 감사합니다

1개의 좋아요

사인패드 자체가 타사에서 제공한 dll을 PInvoke로 가져와서 API만 사용하고 있습니다…
예를들면 SignPad_BtnCheck() 이런식으로 호출하면 결과값 1은 확인 2는 취소 이런식입니다.
이미지또한 사인패드dll이 만들어주고 생성되 이미지의 경로만 반환해주고 있습니다.
말씀해주신 접근방법은 힘들 것 같습니다. 제가 C#공부도 이제 시작해서 잘 이해도 안되구용…

1개의 좋아요

마찬가지로 별도의 스레드에서 SignPad_BtnCheck()를 폴링방식으로 (이벤트 방식을 지원해주면 이벤트 방식이 가장 좋습니다.) 처리하고 입력이 완료되거나 취소했을 때 작업을 종료하는 식이 좋습니다.
윈폼에서는 BackgroundWorker를 쓰시면 구현이 가능하실 것 같은데요. 어떠세요?

1개의 좋아요

예제보고 테스트해보겠습니다.!
안그래도 실제 프로그램에 적용해서 테스트해야하는데 대안으로 만들어두겠습니다.
답변 감사합니다. 많은 도움이 되었습니다

1개의 좋아요