2009-01-03 32 views
6

Có ai biết một cách thông minh để có được thông tin về áp lực máy tính bảng/bút trên Windows không?Làm thế nào để bạn lấy thông tin về áp lực bút trên cửa sổ?

Có thể phân biệt bút stylus với chuột bằng :: GetMessageExtraInfo, nhưng bạn không thể nhận thêm bất kỳ thông tin nào ngoài đó. Tôi cũng tìm thấy API WinTab ở góc đường của trang Wacom, nhưng đó không phải là một phần của cửa sổ theo như tôi có thể nói, và có một hệ thống sự kiện/nhắn tin hoàn toàn riêng biệt từ hàng đợi tin nhắn.

Với tất cả những gì tôi muốn là thông tin áp lực cơ bản nhất chắc chắn có một API chuẩn Win32/COM, có ai biết nó có thể là gì không?

Trả lời

2

Bạn cần sử dụng API Pen/Ink Tablet PC. Phiên bản COM của API tồn tại trong InkObj.dll. Đây là điểm bắt đầu cho tài liệu: http://msdn.microsoft.com/en-us/library/ms700664.aspx

Nếu tôi nhớ chính xác, InkObj.dll có sẵn trên Windows XP SP2 và tất cả các hệ điều hành khách Windows sau, bất kể máy tính là Tablet PC.

2

UPDATE:
Nó được một số năm kể từ khi tôi bước đầu cung cấp câu trả lời này, nhưng wintab đã trở thành tiêu chuẩn de facto, và Ntrig nhiều hơn hoặc ít hơn gấp, thậm chí còn tạo một wrapper để cho phép các API wintab để được truy cập thông qua bộ số hóa này.
(http://www.tabletpcbuzz.com/showthread.php?37547-N-trig-Posts-WinTAB-Support-Driver)

Đây là một phản ứng khá muộn, nhưng thời gian gần đây vợ chồng tôi mua một máy tính bảng Dell XT, mà khi nó quay ra thực sự sử dụng NTrig, một bộ các giao diện sử dụng mực, được chấp nhận mới API cửa sổ được xuất xưởng cùng với phiên bản Windows XP Tablet, sau đó là SP 2 và tất cả các phiên bản sau đó.

Rất nhiều máy tính bảng Wacom và những người khác sử dụng API Wintab, hiện không mở và cũng không được phép sử dụng. Từ những gì tôi nghe những người duy trì nó là khá sue-hạnh phúc.

Vì vậy, tùy thuộc vào loại máy tính bảng bạn đang sử dụng và các trình điều khiển bạn đã cài đặt cho máy tính bảng đó. Theo ý kiến ​​thiên vị của tôi, bạn nên làm việc với Ink, vì nó cung cấp (hoặc ít nhất thông qua NTrig và Windows 7 S provide cung cấp) khả năng đa chạm và có thể sẽ là tiêu chuẩn mới cho giao diện máy tính bảng. Nhưng hiện nay, các thiết bị NTrig không dịch thông tin về áp lực và góc của họ cho các ứng dụng dựa trên Wintab thông thường, chẳng hạn như Photoshop hoặc Corel Painter. Các ứng dụng có xu hướng yêu cầu ít nhất một số hỗ trợ cho API Tablet của Microsoft để hoạt động đúng.

+0

FYI, vì tôi thường nhấn câu trả lời này trong tìm kiếm của tôi về wintab: API wintab vẫn thường được sử dụng cho các tương tác bảng cọ vẽ và dường như là tiêu chuẩn de facto, ít nhất cho đến khi nhiều ứng dụng và nhà sản xuất máy tính bảng trang bị thêm hỗ trợ Microsoft Ink. Những người duy trì đặc điểm kỹ thuật hiện tại là Wacom, và họ đã nhận được kết thúc của [vụ kiện mà tôi cho rằng bạn đang đề cập đến] (http://caselaw.findlaw.com/us-federal-circuit/1114074.html). Trang web của họ chào đón các nhà sản xuất khác nói chuyện với họ về việc triển khai thông số kỹ thuật wintab bằng phần cứng của riêng họ. – user1201210

+0

Chà, bốn năm sau! Tôi đã tìm thấy những gì bạn nói là đúng, mặc dù vụ kiện tôi đã đề cập đến là Wacom kiện ai đó vì đã cố gắng chuyển wintab vào giao diện riêng của họ. Điều đó đang được nói, NTrig đã viết một wrapper để cho phép API wintab, và bây giờ Dell XT2 cũ của tôi làm việc với photoshop et al. Tôi sẽ cập nhật câu trả lời này. – NateDSaint

2

Cách hiện tại để thực hiện việc này là xử lý WM_POINTERnnn thông báo. Lưu ý điều này là dành cho Win 8 trở lên.

Lưu ý bạn sẽ nhận được các thông điệp này để chạm VÀ bút, vì vậy bạn cần phải biết pointerType để kiểm tra bút. WPARAM nhận được bởi WNDPROC cho WM_POINTERnnnn msg như WM_POINTERUPDATE và các thông điệp khác chứa id con trỏ mà bạn sẽ cần để yêu cầu thêm thông tin. Theo kinh nghiệm tôi thấy rằng WM_POINTERUPDATE kết quả trong thông tin có chứa dữ liệu áp lực trong khi nếu cờ con trỏ chỉ xuống/lên không có thông tin áp lực.

const WORD wid = GET_POINTERID_WPARAM(wParam); 
POINTER_INFO piTemp = {NULL}; 
GetPointerInfo(wid, &piTemp); 
if (piTemp.pointerType == PT_PEN 
{ 
    UINT32 entries = 0; 
    UINT32 pointers = 0; 

    GetPointerFramePenInfoHistory(wid, &entries, &pointers, NULL); // how many 
    // TODO, allocate space needed for the info, process the data in a loop to retrieve it, test pointerInfo.pointerFlags for down/up/update. 

} 

Khi bạn biết bạn đang xử lý bút, bạn có thể lấy thông tin áp lực từ cấu trúc POINTER_PEN_INFO.

Điều này tương tự như xử lý cảm ứng mặc dù đối với liên lạc bạn muốn nhận dạng cử chỉ và quán tính. Có một mẫu của Microsoft minh họa bằng cách sử dụng các hàm này.

Đó là một phần của một cuộc nói chuyện tích xây dựng: https://channel9.msdn.com/Events/Build/2013/4-022

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