2008-10-04 35 views
18

Tôi đang cố gắng nhúng cửa sổ từ quá trình của tôi vào cửa sổ của quy trình bên ngoài bằng cách sử dụng chức năng SetParent và gặp phải một số sự cố mà tôi hy vọng ai đó có thể giúp tôi với. Trước hết, đây là một phác thảo về những gì tôi hiện đang làm để nhúng cửa sổ của tôi vào ứng dụng:Nhúng HWND vào quá trình bên ngoài bằng cách sử dụng SetParent

HWND myWindow; //Handle to my application window 
HWND externalWindow; //Handle to external application window 

SetParent(myWindow,externalWindow); 

//Remove WS_POPUP style and add WS_CHILD style 
DWORD style = GetWindowLong(myWindow,GWL_STYLE); 
style = style & ~(WS_POPUP); 
style = style | WS_CHILD; 
SetWindowLong(myWindow,GWL_STYLE,style); 

Mã này hoạt động và cửa sổ của tôi xuất hiện trong ứng dụng khác, nhưng giới thiệu các vấn đề sau:

  • Khi tăng đầu vào cửa sổ tập trung của tôi, cửa sổ ứng dụng chính của quá trình bên ngoài mất tập trung (tức là thanh tiêu đề thay đổi màu sắc)
  • lệnh phím tắt của ứng dụng chính không làm việc trong khi cửa sổ của tôi có tập trung

Có ai biết cách giải quyết vấn đề này không? Tôi muốn cửa sổ của tôi được xem như một cửa sổ con khác của ứng dụng chính.

Trả lời

12

Vâng, cuối cùng tôi đã tìm thấy câu trả lời cho câu hỏi của mình.

Để khắc phục sự cố với ứng dụng chính mất tiêu điểm, bạn cần sử dụng chức năng AttachThreadInput để đính kèm chuỗi cửa sổ được nhúng vào chuỗi ứng dụng chính.

Ngoài ra, người ta có thể sử dụng chức năng TranslateAccelerator để trả lời tin nhắn WM_KEYDOWN để đảm bảo thông điệp tăng tốc của ứng dụng chính được kích hoạt.

0

Tôi đã tìm thấy một số thông tin về điều này tại Catch22.net bằng cách sử dụng Thư WM_NACTIVE.

Đó là trong phần Ngăn chặn việc hủy kích hoạt cửa sổ. Hy vọng điều đó sẽ hữu ích.

4

Tôi không chắc chắn nếu bạn vẫn quan tâm đến chủ đề này sau gần ba năm. Tôi đang làm việc trên một ứng dụng tương tự. Giải pháp của tôi là sửa đổi kiểu cửa sổ trước khi bạn gọi SetParent. Với giải pháp này, tôi không phải gọi đến AttachThreadInput.

Tuy nhiên, một vấn đề lớn khi lưu trữ cửa sổ con từ quy trình bên ngoài là nếu quá trình bên ngoài bị treo trong khi trả lời bàn phím hoặc chuột của người dùng, ứng dụng chính cũng bị treo. Vòng lặp tin nhắn trong ứng dụng chính vẫn đang chạy. Tuy nhiên, nó không còn nhận được sự kiện nhập của người dùng nữa. Do đó, nó xuất hiện như thể nó đang treo. Tôi tin rằng đó là kết quả trực tiếp của AttachThreadInput vì các sự kiện đầu vào của hai luồng được đồng bộ hóa. Nếu một trong số đó bị chặn, cả hai đều bị chặn.

0

Tôi đã gặp phải vấn đề tương tự, sau khi đọc tài liệu MSDN cẩn thận, tôi thấy nó dễ dàng sửa chữa.

Bạn nên loại bỏ WS_POPUP và thêm WS_CHILD TRƯỚC bạn gọi setParent

Nó ghi trong MSDN:

Đối với lý do tương thích, SetParent không thay đổi WS_CHILD hoặc cửa sổ WS_POPUP phong cách của cửa sổ mà cha mẹ là đang bị thay đổi. Do đó, nếu hWndNewParent là NULL, bạn cũng nên xóa bit WS_CHILD và thiết lập kiểu WS_POPUP sau khi gọi SetParent.Ngược lại, nếu hWndNewParent không phải là NULL và cửa sổ trước đây là con của màn hình nền, bạn nên xóa kiểu WS_POPUP và đặt kiểu WS_CHILD trước khi gọi SetParent.

https://msdn.microsoft.com/en-us/library/windows/desktop/ms633541(v=vs.85).aspx

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