웹 브라우저 제어 기능이 있는 Excel 사용자 지정 작업 창 - 키보드/초점 문제
저는 이 정확한 문제를 가지고 있습니다 https://social.msdn.microsoft.com/Forums/vstudio/en-US/e417e686-032c-4324-b778-fef66c7687cd/excel-customtaskpane-with-webbrowser-control-keyboardfocus-issues?forum=vsto .
여기 https://connect.microsoft.com/VisualStudio/feedback/details/521465/the-focus-issue-between-excel-cells-and-excel-customtaskpane-with-webbrowser-control 에도 언급됩니다.
Visual Studio Professional 2013을 사용하여 Excel 2010 플러그인을 작성하고 있습니다.시스템으로 간단한 사용자 지정 작업 창을 만들었습니다.창문들.양식. 웹브라우저 자식이 파일을 작성하고 있습니다.플러그인은 정상적으로 작동하고 나는 클릭하여 체크박스의 상태를 변경함으로써 웹 브라우저 내부를 탐색할 수 있습니다.
입력 텍스트 상자를 클릭하면 포커스가 표시되고 커서가 깜박이지만 입력을 시작하면 텍스트가 Excel로 전송되어 브라우저 내 텍스트 상자 대신 셀에 기록됩니다.
리본이 로드되면 사용자 지정 작업 창을 추가합니다.
private void Ribbon_Load(object sender, RibbonUIEventArgs e)
{
TaskPaneView taskPaneView = new TaskPaneView();
Microsoft.Office.Tools.CustomTaskPane myTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(taskPaneView, "Title");
myTaskPane.Visible = true;
}
텍스트 상자를 클릭하면F6
올바르게 작동합니다.사용자 지정 작업영역 헤더가 약간 어두워지고 텍스트가 텍스트 상자에 캡처됩니다.
입력 텍스트 상자를 클릭하면 엑셀 대신 텍스트가 상자에 들어가도록 하려면 어떻게 해야 합니까?
편집: 네, 테스트를 좀 더 해봤습니다.마우스를 추적하기 위해 TaskPaneView(태스크 창 보기)에 이벤트를 추가하면 를 입력하고 클릭하지만 웹 브라우저 자식을 제거하는 경우에만 작동합니다.즉, 웹 브라우저가 이러한 이벤트를 차단하고 작업 창 보기에 초점이 있다는 것을 파악하지 못합니다.텍스트 상자 양식 컨트롤을 브라우저 옆에 있는 작업 창 보기에 추가하면 텍스트 상자가 완전히 정상적으로 작동하고 작업 창 보기에 포커스가 있음을 알고 브라우저 내부의 입력 텍스트 필드가 작동합니다.포커스 방법을 웹 브라우저에서 직접 호출하면 TaskPaneView는 포커스가 있고 모든 것이 완벽하게 작동한다는 것을 이해합니다.따라서 문제는 키보드에 있는 것이 아니라 브라우저를 클릭하면 키 입력이 잘못된 영역으로 이동하도록 작업 창 보기에 포커스가 있다는 메시지가 표시되지 않는 문제가 분명합니다.TaskPaneView(태스크 창 보기)에 초점을 맞출 수 있는 방법을 찾을 수 있다면 모든 작업에 초점을 맞출 수 있습니다.
네, 다음 코드를 사용하여 문제를 해결할 수 있었습니다.
protected override void WndProc(ref Message m)
{
const int WM_PARENTNOTIFY = 528;
if(m.Msg == WM_PARENTNOTIFY && !this.Focused)
{
this.Focus();
}
base.WndProc(ref m);
}
이 기능을 웹 브라우저 자식이 있는 사용자 제어 기능인 TaskPaneView에 추가했습니다.나는 이것이 왜 또는 어떻게 작동하는지에 대한 깊은 이해는 없지만, 기본적으로 나는 윈도우로 전송된 메시지를 처리하는 하위 기능인 WndProc를 가로채고 있다고 생각합니다.메시지가 528인지 확인하기 위해 사용하는데, 이는 부모님께 알리라는 뜻인 것 같습니다.이게 정확히 어떤 메시지를 들어야 하는지는 모르겠지만, 효과가 있는 것 같습니다.
올바른 메시지 메시지가 나타나면 작업 창 보기에 포커스가 있는지 확인하고 그렇지 않은 경우에는 포커스를 표시합니다.focus()
기능.제가 아까 테스트를 해봤는데 수동으로 호출을 했는지 보여줬습니다.focus
작업 창에서 모든 것이 정상적으로 작동했습니다.그래서 만약 내가 포커스가 없다면 수동으로 포커스를 요청하면 우리는 다 좋습니다.
제가 더 잘 이해할 수 있도록 이것이 작동하는 이유에 대해 누군가가 좀 더 자세한 설명을 해주면 고맙겠지만, 적어도 문제는 해결했습니다.감사해요.Jeremy Thompson
이 문제에 대해 새로운 생각을 하게 해 준 것에 대해.
Q: 이 기능이 작동하는 이유에 대해 보다 자세히 설명하여 이해할 수 있도록 합니다.
잘 되셨다니 다행입니다!근본 원인 분석을 수행하려면 해당 528 메시지가 어디로 전송되는지 확인해야 하며 이를 위해 Microsoft Excel 소스 코드가 필요합니다.
문제를 해결하거나 버그이기 때문에 왜 이런 일이 발생하는지 알아내는 데 더 이상 시간을 쓸 가치가 없다고 생각합니다. 마이크로소프트가 이 문제를 해결하는 데 도움이 되도록 커넥트 버그를 기록하는 것이 최선의 방법입니다.우리는 그 문제를 해결할 수 밖에 없어요, 그들의 소스 코드에 문제가 있어요.
VSTO에서 버그를 확인할 수 있는 시나리오를 찾을 수 있는 경우는 거의 없습니다. 사용자가 텍스트 입력을 Add-In 텍스트 상자에 입력하면 메시지가 워크시트의 셀에 흘러들어갑니다.내 상황에서; 메시지가 전송되지 않은 곳에서Calendars_SelectedChange()
이벤트. 한스가 잘 설명하는 행동에 대한 약간의 주제가 여기서 형성되는 것을 볼 수 있습니다. (제 코멘트에서 연결한 Q&A의 인용)
문제가 되지 않는 것은(흔히 문제가 될 수 있음) Excel의 메시지 펌프를 사용하여 Windows 메시지를 발송하는 것입니다. 이 메시지는 이러한 제어 장치가 입력에 응답하도록 합니다.WPF에서도 WPF와 마찬가지로 잘못된 것입니다. WPF에도 메시지가 윈도우에 전달되기 전에 필터링하는 자체 디스패치 루프가 있습니다.각자의 디스패처를 사용하지 않을 때 문제가 되는 핵심 사항은 바로 가기 키 누르기와 같은 것들입니다.
그런 다음 엑셀이 메시지를 보내기 전에 자체 필터링을 함으로써 이런 문제가 발생할 수 있습니다.악성 소프트웨어 방지 기능을 생각해보면, 마이크로소프트는 오피스 앱을 엉망으로 만드는 프로그램에 대해 영원히 걱정하고 있을 것입니다.
VSTO WPF Connect의 경우 메뉴가 클릭 이벤트를 수신하지 않는 것을 잊지 마십시오.이 해결 방법에는 DispatcherFrame을 사용하여 메시지를 펌핑하고 GotFocusEvent 및 LostFocusEvent 메뉴에 가입하는 방법이 포함되었습니다.
그래서 버그는 입력에 반응하는 제어 장치와 관련이 있습니다.void WndProc(ref Message m)
메시지가 잘못 필터링되거나 디스패치 루프에서 리디렉션되는 경우.
언급URL : https://stackoverflow.com/questions/30948205/excel-customtaskpane-with-webbrowser-control-keyboard-focus-issues
'bestsource' 카테고리의 다른 글
argv 포인터를 글로벌하게 사용해도 안전합니까? (0) | 2023.11.05 |
---|---|
Woocommerce 3 전용 주문 제작 후크 (0) | 2023.10.31 |
그래픽 드라이버 "헬로 월드" 예시? (0) | 2023.10.31 |
MySQL 테이블에 열의 복사본을 빠르게 추가합니다. (0) | 2023.10.31 |
터미널에서 데이터베이스의 sql 파일 실행 (0) | 2023.10.31 |