2012-11-26 21 views
8

Trong thời gian "cũ" tôi đã tạo công cụ đơn giản cho người dùng Windows, theo dõi những gì họ đang làm ở phía trước máy tính (nơi hoạt động đơn giản theo dõi). Tôi đã sử dụng Win32 api và các chức năng như GetForegroundWindow, GetWindowThreadProcessId, vvCách theo dõi các ứng dụng WinRT (trong Win32 nó đơn giản)?

Hôm qua tôi đã cài đặt Windows 8 mới và mệt mỏi để chạy chương trình của mình. Tôi đã đạt được 50% thành công: cho máy tính để bàn "cổ điển", nó hoạt động như mọi khi :). Đối với Metro UI Tôi chỉ có một ứng dụng: WWAHost :(mà không cần bất kỳ chi tiết

Vì vậy, câu hỏi của tôi là:. Là có một cách nào để theo dõi ứng dụng tích cực trong Metro UI Nhờ sự giúp đỡ

UPDATE:? Tôi đang cố gắng truy cập ứng dụng Metro UI từ Win32, tôi biết rằng việc truy cập ứng dụng Metro từ một ứng dụng Metro khác là không thể

+0

Bạn đã thử GetPackageFullName hoặc GetApplicationUserModelId, để hy vọng có thể phân biệt được Windows Web Apps? –

+0

@DwayneRobinson Tôi nên sử dụng phương pháp này như thế nào? –

Trả lời

0

Tôi chắc chắn điều này sẽ không thể thực hiện được với Windows 8 'Metro'. Tất cả các ứng dụng khác sẽ ở trạng thái treo trong khi ứng dụng trên cùng đang chạy. Điều này làm cho nó không thể viết một ứng dụng m giám sát các ứng dụng khác hiện đang thực thi.

Xem numerous articles on the Windows 8 app lifecycle.

+0

+1, mặc dù tôi sẽ không mô tả đó là lý do *. Lý do đơn giản là hệ điều hành được thiết kế để ẩn thông tin đó từ các ứng dụng WinRT. Cho dù * một số * hoặc * không * ứng dụng khác thực sự đang chạy, không phải là việc kinh doanh của ứng dụng WinRT. –

+1

Nhưng trong phiên bản máy tính để bàn của Windows, tôi có ứng dụng "cổ điển" chạy song song với ứng dụng WinRT, vì vậy có thể từ win32 "cổ điển" tôi có thể truy cập những gì người dùng đang làm? –

+0

Tôi tin rằng Garath đang tìm kiếm một cách để có được ứng dụng Metro ™/Modern ©/Lollipop® hiện đang chạy từ chương trình Win32 của mình, chứ không phải ứng dụng kẹo khác. – efotinis

1

Bạn thấy đấy, trong WinRT, ứng dụng của bạn là ứng dụng cao nhất. Và khi ứng dụng của bạn không phải là ứng dụng nhiều nhất thì các chủ đề của bạn bị tạm ngưng và hạt nhân sẽ không lên lịch thêm bất kỳ thao tác nào cho ứng dụng của bạn. Kết thúc câu chuyện.

Điều này có nghĩa là những gì bạn muốn hoàn thành không thể thực hiện được trong WinRT. Bạn đang suy nghĩ giống như một ứng dụng thường trú hoặc một dịch vụ có quyền truy cập vào máy tính để bàn. Những ứng dụng đó có hai ưu điểm. 1) chúng luôn chạy. Và, 2) họ có API để làm những gì bạn muốn.

WinRT cố tình đặt ứng dụng vào hộp cát để trải nghiệm, hiệu suất và thời lượng pin của người dùng được bảo vệ. Kịch bản và điểm số của bạn giống như kịch bản của bạn nhấn mạnh nhu cầu tiếp tục cho các ứng dụng dành cho máy tính để bàn. (miễn là có nhu cầu tiếp tục đối với các loại ứng dụng đó;)).

Xin lỗi, nếu đây là tin xấu.

Để liệt kê các ứng dụng khác. Điều này cũng không thể. Bạn không thể biết nếu một ứng dụng khác được cài đặt hay nó đang chạy. Bạn có thể gọi ra một ứng dụng khác thông qua kích hoạt giao thức hoặc kích hoạt tệp hoặc (theo nghĩa) thông qua hợp đồng chia sẻ. Nhưng bạn không biết nếu họ nhận được tin nhắn và nếu người dùng đã cài đặt nó ở nơi đầu tiên. Và điều này là do thiết kế.

Điều đáng nói là bạn có thể ghim vào Win32 API trong ứng dụng WinRT của mình. Nó gây ra rất nhiều vấn đề và có thể gây đau đầu để được chứng nhận vào cửa hàng. Nhưng thậm chí sau đó, không phải tất cả các API đều mở cho bạn. Và bạn sẽ thấy trường hợp sử dụng cụ thể này là không khởi động.

+0

Tôi đã viết bản cập nhật này: tôi đang cố truy cập WinRT từ Win32 api chứ không phải WinRT từ WinRT –

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