ALT+ENTER시 사용자개체증가 원인은 WEBBROWSER 입니다. 하지만 해결은 안됩니다.

안녕하세요

사용자 개체 증가 문제로 후킹 질문을 드렸습니다.

그런데

파고들다보니 webbroser 콘트롤에서 문제가 발생하는것 같습니다.

텍스트박스에서

alt+efnter를 치면

폼위에 있는 webbrowser 개수만큼

사용자 개체가 늘어납니다.

그리고

alt+enter시

사라지는 메세지박스를 만들어서

화면에 잠깐 나왔다가 사라지는 부분을 추가하면

사용자 개체가 증가하지 않습니다.

이건 정말 미궁입니다.

간단한 프로젝트소스 입니다.

정말 원인을 알고싶습니다.

https://drive.google.com/file/d/17VL4d1vVnaPKCsbXTSzuEyS54wep5CtC/view?usp=sharing

구글 드라이버에 공유 해놨습니다. vs2022로 만들었습니다.

작업관리자 → 세부보기 → 열선택에서 사용자개체 체크하면 해당 부분을 확인할수있습니다.

왜 이런증상이 발생하는지 혹시 도움을 받을수있을까 합니다.

잘부탁드립니다.

1 Like

어떻게 테스트해보면 되는건가요?

아 이거랑 관련된 글이였군요
https://forum.dotnetdev.kr/t/alt-ctrl/9684

1 Like

다행히 옛날옛적 컨트롤이 자체적으로 가지고있던 단축키 기능중 하나가 뒤섞여 발생한 알만한 해프닝이었던거고, 질문자님이 당하신 뒷통수의 본질을 파고들어봐야 별로 영양가도 없고 피곤하지 않을까 싶습니다.
마이그레이션돌리고 Webview2 쓰고 광명찾읍시다.

1 Like

재현이 안되네요

Winform 자체에 alt Enter키를 안먹히게 하는 방법은 있습니다.

 protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
 {
     Console.WriteLine (msg.Msg);
     Keys keys = Keys.Alt | Keys.Enter;
     if (keyData == keys)
     {
        /// 여기서 강제로 Ctrl Enter로 변경할 로직 추가
         return true;
     }
     return base.ProcessCmdKey (ref msg, keyData);
 }

윈폼에 이렇게 코드를 추가하신다면 alt enter 인한 사용자 개체는 증가하지 않습니다.

1 Like

네 맞습니다.

단순히 웹브라우저를 보여주는것이아니라
해당 컨트롤에서 데이터를 편집해서 html형식으로 wyswic 으로
html형태의 데이터와 html을 제거한 데이터를 저장하는식으로
사용했습니다.

private mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)this. WebBrowser1.Document.DomDocument;
doc.designMode = “On”;

webview2도 이런것이 가능할까요?

htmldata = doc.body.innerHTML; // html태그 포함데이터 반환

innnerText = doc.body.innerText; //html태그뺀 데이터 반환

doc.body.innerHTML = html; //html데이터 세팅.

alt+ enter를 막는것이 아니라

alt+enter시에 contol+enter로 바꾸고 싶은 것입니다.

사용자는 alt+enter 를 몇년간 사용해서 해당 키를 그대로 사용하고

싶다고 하는거 였습니다.

보여주신 소스를 보니 alt+enter → ctrl+enter로 변환할수도 있을것 같은데

hooking 관련된 자료들을 찾아서 적용해볼려고 해도

적용이 잘되지 않고 결국 후킹을 해도 사용자 컨트롤에 넘어온것은 alt키 여서

잘안되더라구요.

증상이 발생 안된다는 것입니까?
아니면 프로젝트가 실행이 안된다는 것입니까?

실행은 되는데, 증상이 없습니다.

사용자가 무엇을 누르던, 그 이벤트를 통해 기대하는 기능을 구현해주면 되는 거 아닌가요?

네 맞습니다. 그런데
원하지 않는 사용자개체 증가 현상이 생겨서 그렇습니다.

https://drive.google.com/file/d/1Keg09WWHpo1VmUr_15aqXzq7apnOy2xA/view?usp=sharing

해당 현상을 프로젝트실행 녹화한것입니다.

텍스트박스에 대고 Alt+Ctrl하니까 재현되네용

사실 무사히 이식하는데까지 얼만큼의 대공사와 삽질이 발생할지는 해보기전까지 모르는일이지만요,
몇줄만 봐서는 자바스크립트와 DOM접근만 가능하면 다 될만한 내용같아보여요

https://learn.microsoft.com/dotnet/desktop/winforms/migration

https://learn.microsoft.com/microsoft-edge/webview2/get-started/winforms

네 감사합니다. 결국은 webview2로 가야하나 싶습니다.
기존대로 사용할수만 있다면 가야하는게 맞기도 하지만
겨우 alt+enter키 하나로 이모든걸 다 바꿔야 하나싶어서
현타가 옵니다. ㅜ,.ㅜ

네 적용을 해보았습니다만

Key keyx = Keys.Control | Keys.Enter

로 해서

return 부분에 keydata 대신에 keyx로

리턴시켰지만. 사용자 개체 증가는 막을수없었습니다.
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
Console.WriteLine(msg.Msg);
Keys keys = Keys.Alt | Keys.Enter;

      if (keyData == keys)
      {
          /// 여기서 강제로 Ctrl Enter로 변경할 로직 추가
          Keys cKey = Keys.Control | Keys.Enter;
          keyData = cKey;       
      }
     
      return base.ProcessCmdKey(ref msg, keyData);
  }

희안하게도 contol+enter는 전혀 영향을 안주니…

댓글감사드립니다.

프로젝트에 있던 웹브라우저 콘트롤 다 지우고 새롭게 넣으니, 증상이 사라졌습니다.

그런데, 새롭게 채운 WebBrowser 콘트롤의 Document 속성이 null 로 설정되더군요.
그래서 Form1_Load 메서드에서 할당하는 코드를 주석처리했습니다.

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    Keys keys = Keys.Alt | Keys.Enter;
    if (keyData == keys)
    {
        Keys tempkeys = Keys.Control | Keys.Enter;
        SendKeys.Send ("(^{ENTER})");
        return true;
    }
    return base.ProcessCmdKey (ref msg, keyData);
}

위처럼 코드를 변경하신다면
사용자 개체 증가도 일어나지 않으면서
Contol+Enter는 아니여도 Alt+Control+Enter의 이벤트가 발생합니다.
확인해보세요 :slight_smile:

2 Likes

정말 감사합니다. 개체 증가하지 않고
keydown이벤트로 잘들어오네요!!

그런데 신기한게 control+alt 같이 들어올까요??

네 저도 도구상자에서 새로 끌어오면
null에러나더라구요

그래서 기존꺼 그냥 콘트롤 복사해서 썼습니다.

document는 꼭써야해서 null 들어오는 부분을 아직 파악하지는 못했지만

저부분은 없으면 안되어서 그냥 진행했습니다.

감사합니다.

자세한 정보는 없어서 추측으로는
현재 눌려져있는 키는 alt + enter가 눌려있는 상태에서

아래 명령어(ctrl + enter)는 변경이라기보단 추가가 되는것으로 판단됩니다.

SendKeys.Send (“(^{ENTER})”);

그렇기 때문에

ctrl + alt + enter
로 인식된거같아요 :slight_smile:

1 Like