2013-08-04 58 views
14

Tôi đang cố gắng sử dụng hàm SetForegroundWindow(HWND hWnD). Tôi có một số xử lý nhưng nó không hoạt động như tham số của hàm trên. Tay cầm của tôi là một sợi chỉ và tôi muốn chạy nó ở nền trước.Sự khác nhau giữa HANDLE và HWND trong Windows API?

Sự khác nhau giữa HWND và HANDLE là gì?

Trả lời

8

"xử lý" là thuật ngữ chung được sử dụng để chỉ một mã thông báo xác định tài nguyên trên hệ thống (menu, mô-đun DLL, khối bộ nhớ, v.v.). Thường được gọi là "cookie ma thuật", nó thường được trả lại khi bạn tạo tài nguyên lần đầu tiên. Sau đó, bạn chuyển điều khiển đó cho các hàm khác trong API chịu trách nhiệm xử lý tài nguyên. Bạn thường không cần biết xử lý là gì. Đôi khi nó có thể là một con trỏ, lần khác một số, có lẽ là một cấu trúc, hoặc bất cứ điều gì. Đó là lý do tại sao họ ẩn nó bằng cách sử dụng tên như HWND mà chỉ đơn giản là xử lý được sử dụng để xác định một cửa sổ (trả về bởi hàm API "CreateWindow()"). Do đó, bạn không chuyển đổi "xử lý" thành HWND và ngược lại vì HWND đã là một "xử lý" (một trong số đó chỉ xác định các cửa sổ bạn tạo).

Tìm thấy đây http://forums.codeguru.com/showthread.php?135438-Handle-and-HWND

Bạn có thể sử dụng FindWindow để có được hwnd từ một ứng dụng http://msdn.microsoft.com/en-us/library/windows/desktop/ms633499(v=vs.85).aspx

này sẽ cho phép bạn để có được những HWND với điều kiện bạn có xử lý với những gì bạn đang tìm kiếm C++ Handle as HWND?

+0

yep, tks !, nhưng tôi có thể chuyển đổi từ xử lý thành hwnd không? – Thangnv

+1

@Thangnv Điều này giống như hỏi "Tôi có thể chuyển đổi từ' void * 'thành' int * '?" Nó phụ thuộc. Tay cầm của bạn là gì? – timothyqiu

+0

Xử lý của tôi là một chuỗi và tôi muốn chạy nó ở nền trước, nhưng nó không phải là một HWND trong hàm SetForegroundWindow (HWND hWnD). – Thangnv

27

Chúng chỉ là abstract data types.

Theo MSDN, HANDLEHWND được định nghĩa là:

  • HANDLE là một handle đến một đối tượng.
  • HWND là tay cầm vào cửa sổ.

Vì vậy, một HWND là một HANDLE, nhưng không phải tất cả HANDLE s là HWND. Trong thực tế:

typedef void *PVOID; 
typedef PVOID HANDLE; 
typedef HANDLE HWND; 

Ví dụ

Bạn chỉ nên vượt qua HWND để SetForegroundWindow trừ khi bạn biết những gì bạn đang làm.

HWND hWnd = FindWindow(NULL, "Calculator"); 
SetForegroundWindow(hWnd); 

Điều này trước tiên sẽ xử lý cửa sổ có tiêu đề "Máy tính" với FindWindow và sau đó mang cửa sổ đó sang nền trước.

+4

Các typedef này chỉ được sử dụng nếu 'STRICT' không được xác định. Nếu có, 'HWND' không được định nghĩa là' HANDLE' nữa, mà là kiểu dữ liệu độc lập và độc lập. –

+3

@RemyLebeau Phần 'typedef' được trích dẫn từ [tài liệu chính thức] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx). (Nhưng tôi đã kiểm tra tiêu đề, được xác định theo cách bạn mô tả. Cảm ơn.) – timothyqiu

6

HWND cũng là một HANDLE, nhưng HWND là một loại toàn cầu. I.e. một HWND hợp lệ trong bối cảnh của một tiến trình cũng hợp lệ trong ngữ cảnh của một tiến trình khác.

Một số thông tin không có giấy tờ tại http://forum.sysinternals.com/internal-wnd-structure-in-win7_topic24988.html.

+3

"nhưng một cái toàn cầu" là chính xác những gì tôi đang tìm kiếm. Thx mate. – Pyjong

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