2015-06-19 20 views
13

Tôi gặp vấn đề này chính xác https://social.msdn.microsoft.com/Forums/vstudio/en-US/e417e686-032c-4324-b778-fef66c7687cd/excel-customtaskpane-with-webbrowser-control-keyboardfocus-issues?forum=vstoExcel CustomTaskPane với điều khiển WebBrowser - bàn phím/tập trung phát

Cũng đề cập ở đây https://connect.microsoft.com/VisualStudio/feedback/details/521465/the-focus-issue-between-excel-cells-and-excel-customtaskpane-with-webbrowser-control

Tôi viết một Excel 2010 Plugin sử dụng Visual Studio Professional 2013. Tôi đã tạo một đơn giản CustomTaskPane với một System.Windows.Forms.WebBrowser con nộp nó. Plugin hoạt động tốt và tôi có thể điều hướng bên trong trình duyệt web bằng cách nhấp và thay đổi trạng thái hộp kiểm.

enter image description here

Khi tôi bấm vào một hộp đầu vào tôi nhận được tập trung và tôi nhìn thấy con trỏ nhấp nháy, nhưng khi tôi bắt đầu gõ văn bản được gửi đến Excel và ghi vào một tế bào thay vì hộp văn bản bên trong trình duyệt.

Tôi thêm thanh tác vụ tùy chỉnh khi băng tải.

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; 
} 

Khi tôi nhấp vào hộp văn bản, sau đó nhấn F6 hoạt động chính xác. Tiêu đề customtaskpane tối hơn một chút và văn bản được ghi lại trong hộp văn bản.

Làm cách nào để khắc phục sự cố này để khi tôi nhấp vào hộp văn bản đầu vào, văn bản sẽ được chuyển vào hộp thay vì Excel?

EDIT: Ok, tôi đã làm một số thử nghiệm khác. Nếu tôi thêm các sự kiện trên TaskPaneView của mình để theo dõi chuột nhập và nhấp vào chúng hoạt động, nhưng chỉ khi tôi xóa con trình duyệt web. Có nghĩa là trình duyệt web bằng cách nào đó sẽ chặn các sự kiện này và ngăn TaskPaneView hiểu được nó đã tập trung. Nếu tôi cũng thêm điều khiển biểu mẫu hộp văn bản vào TaskPaneView dọc theo bên trình duyệt, hộp văn bản hoạt động hoàn toàn tốt và TaskPaneView hiểu rằng nó có tiêu điểm và sau đó trường nhập văn bản bên trong trình duyệt sau đó bắt đầu hoạt động. Nếu tôi gọi phương thức lấy nét trực tiếp trên trình duyệt web, TaskPaneView hiểu rằng nó có tiêu điểm và mọi thứ hoạt động hoàn hảo. Vì vậy, rõ ràng vấn đề không thực sự với bàn phím, nhưng thay vào đó một vấn đề của TaskPaneView không được cho biết nó đã tập trung khi trình duyệt được nhấp vào để các tổ hợp phím đi đến vùng sai. Nếu tôi có thể tìm ra cách để làm cho TaskPaneView hiểu nó có trọng tâm thì mọi thứ sẽ hoạt động.

+1

Thực hiện rất nhiều điều khiển VSTO Excel ... Và sự nghi ngờ của tôi là liên quan đến Message Pumps misbehaving: [BUG: Cant chọn ngày trên DatePicker nằm ngoài một VSTO Add-In nổi] (http: // stackoverflow. com/questions/10526118/bug-cant-chọn-ngày-on-a-datepicker-đó-mùa thu-bên ngoài-một-nổi-vsto-add-in) - ** bằng cách nào đó hộp văn bản của bạn là bơm tin nhắn vào tế bào! * * –

Trả lời

6

Ok tôi đã có thể khắc phục vấn đề bằng cách sử dụng đoạn mã sau

protected override void WndProc(ref Message m) 
{ 
    if(m.Msg == 528 && !this.Focused) 
    { 
    this.Focus(); 
    } 
    base.WndProc(ref m); 
} 

tôi đã thêm chức năng này để TaskPaneView của tôi mà chỉ đơn giản là một usercontrol với con webbrowser. Tôi không có một sự hiểu biết sâu sắc về lý do tại sao hoặc làm thế nào điều này hoạt động, nhưng về cơ bản tôi nghĩ rằng những gì đang xảy ra là tôi chặn WndProc đó là một số chức năng cấp thấp xử lý tin nhắn được gửi đến cửa sổ. Tôi sử dụng nó để kiểm tra xem tin nhắn có phải là 528 hay không, điều mà tôi nghĩ có nghĩa là informParent. Tôi không biết đây có phải là thông điệp chính xác mà tôi nên lắng nghe, nhưng có vẻ như nó hoạt động.

Khi tôi có tin nhắn đúng, tôi kiểm tra xem TaskPaneView có tập trung hay không và tôi có tập trung vào chức năng focus() hay không. Tôi đã thử nghiệm trước đó cho thấy nếu tôi tự gọi focus trên TaskPaneView tất cả mọi thứ làm việc tốt. Vì vậy, nếu tôi không tập trung, sau đó yêu cầu lấy nét theo cách thủ công và tất cả chúng ta đều tốt.

Tôi sẽ đánh giá cao nếu ai đó có thể cung cấp giải thích chi tiết hơn về lý do tại sao điều này hoạt động để tôi có thể hiểu nó tốt hơn, nhưng ít nhất tôi đã giải quyết được vấn đề. Cảm ơn Jeremy Thompson vì đã giúp tôi suy nghĩ về vấn đề này theo một cách mới.

+2

Tìm kiếm điều này trong vài ngày và đã thử các bản sửa lỗi không thành công khác nhau (bao gồm thư viện globalmousekeyhook ấn tượng có sẵn @ https://github.com/gmamaladze/globalmousekeyhook) nhưng không có gì hoạt động ấn tượng như thế này. Nó hoạt động như một say mê. Cảm ơn một tấn. – HCJ

3

Q: Cung cấp một lời giải thích chi tiết hơn về việc tại sao các công trình này vì vậy tôi có thể hiểu được nó tốt hơn

Vui mừng bạn đã nhận nó làm việc! Để thực hiện phân tích nguyên nhân gốc, chúng tôi cần xem thông báo 528 được gửi đến đâu và chúng tôi cần mã nguồn Microsoft Excel để thực hiện điều đó.

Tôi không nghĩ giá trị của nó mất thêm thời gian để khắc phục sự cố hoặc giải thích tại sao điều này xảy ra vì CNTT LÀ L BUI! Đăng nhập một kết nối lỗi để giúp Microsoft sửa chữa nó là điều tốt nhất bạn có thể làm. Chúng tôi chỉ có thể làm việc xung quanh nó, đó là một vấn đề trong mã nguồn của họ.

Rất hiếm khi bạn tìm thấy những trường hợp này trong VSTO để xem lỗi và bạn chắc chắn đã tìm thấy một lỗi; trong đó người dùng nhập văn bản nhập vào hộp văn bản Add-Ins và thông báo sẽ chuyển vào một ô trong trang tính !! Trong tình huống của tôi; nơi thông báo không được bơm tới sự kiện Calendars_SelectedChange(). Vì vậy, chúng ta có thể thấy một chút của một chủ đề về hành vi hình thành ở đây là Hans giải thích cũng (Trích dẫn từ Q & AI liên kết đến trong nhận xét của tôi):

Có gì không bao giờ không phải là một vấn đề (ví dụ thường có thể có vấn đề) là bạn dựa vào máy bơm thông báo trong Excel để gửi các tin nhắn Windows, các thông điệp mà làm cho các điều khiển này đáp ứng với đầu vào. Điều này đi sai trong WPF nhiều như Winforms, họ có vòng lặp công văn riêng của họ để lọc các thông báo trước khi chúng được gửi đến cửa sổ. Những điều quan trọng sai khi người điều phối tương ứng của họ không được sử dụng là những thứ như tabbing và tổ hợp phím ngắn.

Và sau đó một số, loại vấn đề này sẽ được gây ra bởi Excel thực hiện lọc riêng của mình trước khi gửi thư. Tôi đoán tại một tính năng chống phần mềm độc hại, Microsoft luôn lo lắng về các chương trình gây rối với các ứng dụng Office.

Và đừng quên VSTO WPF Connect case with menu's not receiving click events. Giải pháp thay thế liên quan đến việc sử dụng DispatcherFrame để bơm tin nhắn và đăng ký GotFocusEvent và LostFocusEvent cho menu.

Vì vậy, lỗi là phải làm với các điều khiển phản hồi đầu vào và void WndProc(ref Message m) thư bị lọc hoặc chuyển hướng không chính xác trong vòng công văn.

Các vấn đề liên quan