2013-03-21 17 views
11
  • VS 2010
  • Phát triển ứng dụng 32-bit chạy trên hệ điều hành 64-bit (Win7, Win8 - ứng dụng máy tính để bàn)
  • C#
  • .NET 4.0
  • WinForms

tôi đã tìm thấy nhiều chủ đề về triển khai Windows bàn phím trên màn hình (osk.exe) từ một ứng dụng, nhưng đang chạy vào một số vấn đề. Có vẻ như tôi đang chạy một ứng dụng 32 bit trên hệ điều hành 64 bit. Tôi đã thử mã được đăng bởi WooCaSh tại đây: Keyboard on the screen in WinFormsLàm thế nào để sử dụng Windows On Screen Keyboard trong WinForms C#

Nhưng không một trong ba đường dẫn khác nhau phù hợp với tôi. Đối với đường dẫn "sysnative", Process.Start "Không thể tìm thấy đường dẫn được chỉ định." Đối với đường dẫn system32 và osk.exe, tôi nhận được hộp thoại lỗi "Không thể khởi động bàn phím ảo".

Tôi tìm thấy một workaround có thể ở đây, đó là nhiều hơn một chút phức tạp hơn những gì tôi đang tìm kiếm (bài bởi eryang): http://social.msdn.microsoft.com/Forums/en-US/netfx64bit/thread/10ebc62f-e6d7-4072-9fd1-ea3784a0966f/

  1. Có một cách dễ dàng hơn hoặc đúng để làm điều này?
  2. Tôi hy vọng rằng việc chạy ứng dụng của tôi trên máy tính bảng sẽ tự động khởi chạy bàn phím ảo khi người dùng chọn hộp văn bản nhưng không may mắn. Đây có phải là bình thường hay tôi đang thiếu một cái gì đó? EDIT: Tìm thấy rằng bàn phím không được tự động khởi chạy trong Win8 khi ở chế độ Desktop (ứng dụng của tôi): http://www.bleepingcomputer.com/forums/t/480250/keyboard-does-not-pop-up-automatically/ Dường như nó hoạt động trên máy tính bảng Win7, nhưng tôi không thể kiểm tra vì tôi chỉ có máy tính bảng Win8 ở đây.
+0

Chỉ cần thay đổi cài đặt Nhắm mục tiêu nền tảng trên dự án EXE của bạn thành "AnyCPU". –

+0

Thật không may nó cần phải được x86 cho một số phần mềm bên thứ 3 nó tương tác với. – Tara

+0

Chỉ để thử nghiệm, tôi đã tiếp tục và thay đổi thành "AnyCPU". Bàn phím vẫn sẽ không khởi chạy trên máy tính để bàn Win7 64-bit của tôi, nhưng được khởi chạy trên máy tính bảng Win8 64 bit. Bất kỳ ý tưởng? – Tara

Trả lời

18

Tôi bây giờ tung ra "Bàn phím cảm ứng" như trái ngược với "On-Screen Keyboard" (đó là bàn phím tôi muốn trên Windows 8 anyway) với:

string progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink"; 
string keyboardPath = Path.Combine(progFiles, "TabTip.exe"); 

this.keyboardProc = Process.Start(keyboardPath); 

này hoạt động trên của tôi Win7 và Win8, bất kể ứng dụng 32 bit của tôi trên hệ điều hành 64 bit. Tuy nhiên, tôi vẫn gặp sự cố khi đóng bàn phím khi lập trình xong. Quá trình, this.keyboardProc, dường như không nhận được xử lý, và ngay lập tức có tài sản HasExited = true. Điều này có nghĩa là những nỗ lực của tôi để đóng hoặc giết nó không thành công.

Theo chủ đề này, nếu người dùng mở bàn phím theo cách thủ công (hoặc tôi khởi chạy theo chương trình), bàn phím sẽ không tự động đóng/ẩn khi trường văn bản mất tiêu điểm: Windows 8 - How to Dismiss Touch Keyboard? Tôi đã cố gắng giải quyết sự cố tập trung vào nút ẩn, nhưng kể từ khi tôi tự khởi chạy bàn phím, nó không tự động đóng.

+3

Công việc tuyệt vời! Tôi đã lãng phí ít nhất một giờ trên crap này. Giải pháp của bạn đã giúp tôi. – bump

+0

Làm việc cho tôi trên máy tính bảng Windows 10. Không có gì giống như giữ một con khủng long còn sống ... – brady321

+0

Xin lưu ý rằng bạn có thể không cài đặt các tính năng cửa sổ "Tablet PC Components" ... nếu không bật Bảng điều khiển, Chương trình và Tắt tính năng Windows hoặc trên – Barry

12

Tôi gặp sự cố khi đóng bàn phím ảo. Bạn có thể bắt đầu bàn phím Touch với

 string progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink"; 
     string onScreenKeyboardPath = System.IO.Path.Combine(progFiles, "TabTip.exe"); 
     onScreenKeyboardProc = System.Diagnostics.Process.Start(onScreenKeyboardPath); 

và đóng tất cả các bàn phím với

  //Kill all on screen keyboards 
      Process[] oskProcessArray = Process.GetProcessesByName("TabTip"); 
      foreach (Process onscreenProcess in oskProcessArray) 
      { 
       onscreenProcess.Kill(); 
      } 

Đối với một số lý do onScreenKeyboardProc.Kill() hoặc .Close() không hoạt động.

+0

CNTT hoạt động tốt với tôi:/ – IMAK

0

Khởi động TabTip.exe không còn hoạt động trong Widnows 10 Anniversary Edition. Tôi phát hiện ra một giao diện COM không có giấy tờ để điều khiển bàn phím cảm ứng.Kiểm tra mã tại đây https://stackoverflow.com/a/40921638/332528

4

Để bàn phím tự động mở, các điều khiển phải triển khai một số mẫu điều khiển Tự động hóa giao diện người dùng, cụ thể là ITextProvider/IValueProvider. Đó là một mối phiền toái, nhưng nó hoạt động (và nó là một cách sạch hơn tung ra một số * .exe)

Tôi đã viết một ứng dụng mẫu và một bài báo ngắn ở đây: http://blog.tombam.net/implementing-textbox-with-on-screen-touch-keyboard-part-1/

+0

Bài viết tuyệt vời! Bạn đã phát hiện ra một cách để buộc một bàn phím số? –

1

Bàn phím cảm ứng thúc đẩy sự tự động hóa giao diện người dùng. Đối với một số lý do đó là một bí ẩn đối với tôi, hộp chỉnh sửa Windows chuẩn không thực hiện giao diện người dùng tự động, trong khi các điều khiển khác, như hộp tổ hợp, làm.


Người ta có thể sử dụng tự động hóa giao diện người dùng từ UIAutomationClient.dll.

Để tự động hóa giao diện người dùng được đưa ma thuật vào ứng dụng, trình khởi tạo lớp của lớp nội bộ assembly UiaCoreApi phải được kích hoạt.

On có thể đạt được điều đó ví dụ bằng cách gọi dường như không-op:

AutomationElement.FromHandle(IntPtr)(-1) 

Một cách khác là thực hiện giao diện người dùng tự động hóa một cách rõ ràng. Để thực hiện điều đó, các giao diện ITextProvider/IValueProvider cho điều khiển đầu vào tương ứng.

Để ràng buộc việc triển khai giao diện cho điều khiển, hãy xử lý WM_GETOBJECT window message với lParam = RootObjectId.

Đối với một ví dụ về triển khai, xem

Mặc dù thú vị, điều khiển, bàn phím cảm ứng hoạt động ngoài hộp (như hộp tổ hợp hoặc hộp chỉnh sửa mật khẩu, xem câu trả lời), không triển khai WM_GETOBJECT/RootObjectId. Phải có một máy móc khác đằng sau chúng.


Phổ biến nhất "giải pháp" cho vấn đề này, để bật lên một cách rõ ràng bàn phím bằng cách chạy TabTip.exe hay osk.exe, là khó chấp nhận được.

Nếu không có gì khác, thì không có cách nào để ẩn bàn phím được mở bằng cách chạy TabTip.exe (các giải pháp bao gồm hack như quy trình hoặc gửi Esc khóa).

Và thực tế việc hack ở trên dường như không hoạt động nữa trong Bản cập nhật kỷ niệm Windows 10: Show touch keyboard (TabTip.exe) in Windows 10 Anniversary edition.

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