2010-02-26 19 views
6

Vì vậy, tôi nghĩ điều này sẽ đơn giản và, tốt, tôi đã sai. Dưới đây là một mô tả đơn giản về vấn đề:Cách tìm cửa sổ nền trước một cách đáng tin cậy khi nó không có tiêu điểm

Tôi đang viết một ứng dụng nhỏ cho các nhà sản xuất của chúng tôi sẽ chụp ảnh màn hình toàn bộ màn hình cũng như cửa sổ nền trước khi họ nhấp vào biểu tượng của ứng dụng trong khay hệ thống. Hiện tại, tôi đang sử dụng phương pháp Win32 "GetforegroundWindow" trong sự kiện MouseMove của NotifyIcon để lưu xử lý cửa sổ nền trước và chụp ảnh màn hình trong sự kiện Nhấp chuột.

Điều này đôi khi làm việc, nhưng nếu tôi nhấp vào biểu tượng rất nhanh, tôi thực sự nắm bắt thanh tác vụ thay vì cửa sổ nền trước. Tôi không chắc tại sao điều này lại xảy ra (tôi hiểu rằng thanh tác vụ là một cửa sổ, tôi không hiểu tại sao đôi khi nó dường như tập trung vào MouseMove trước khi tôi nhấp vào), và tôi đã có chút may mắn khi sử dụng phương thức EnumWindows là tốt, có thể bởi vì tôi không hoàn toàn hiểu nó hoạt động như thế nào.

Có vẻ như, nếu tôi có thể lấy vị trí z của mỗi cửa sổ chỉ sử dụng tay cầm cửa sổ, đây sẽ là một vấn đề dễ giải quyết khi sử dụng EnumWindows. Tôi đã không tìm thấy một phương pháp để làm điều đó tuy nhiên.

Vì vậy, tôi hỏi các bạn; làm thế nào bạn sẽ viết một phương pháp để xác định vị trí cửa sổ nền trước đáng tin cậy, cho rằng nó có thể không có tập trung vào thời điểm đó? Hoặc là google-fu của tôi là không cho tôi hoặc thông tin về điều này là thưa thớt. Cảm ơn trước.

Trả lời

1

Thanh tác vụ giống như cửa sổ nền trước hợp lệ. Khi bạn nhấp vào nó, nó sẽ tạm thời là cửa sổ nền trước. Và nếu bạn nhấp vào Bắt đầu và nhấn Escape chẳng hạn, nó sẽ là cửa sổ nền trước cho đến khi bạn nhấp vào nó.

Bạn có thể sử dụng GetWindow khi HWND_NEXT truyền qua tay cầm cửa sổ của thanh tác vụ.

Không, vì thanh tác vụ là cửa sổ trên cùng, GetWindow (hoặc GetNextWindow, v.v.) sẽ hoạt động khác nhau. Tôi sẽ đề nghị xem xét lại các giải pháp EnumWindows mà có lẽ là đặt cược tốt nhất của bạn.

+0

Phải, tôi hiểu rằng thanh tác vụ là một cửa sổ, nhưng đó chính xác là những gì tôi đang cố gắng tránh. Tôi cần phải nhận được hWnd của cửa sổ foreground hợp lý. Tôi sẽ cố gắng vượt qua HWND_NEXT và xem liệu điều đó có luôn luôn trả về những gì tôi theo sau hay không. Cảm ơn. –

+0

Tất nhiên, bây giờ tôi cần để có thể tìm thấy tay cầm vào thanh tác vụ = P.có lẽ được định nghĩa ở đâu đó cho tôi, tôi sẽ xem xét (tôi biết máy tính để bàn là 0). –

+0

Thực ra bạn đã có tay cầm tại thời điểm đó. Bạn chỉ cần sử dụng GetClassName để xác định xem đó có phải là thanh tác vụ hay không. Nếu bạn đã cài đặt Spy ++, bạn có thể sử dụng nó để tìm tên lớp. Tôi không biết nó. http://msdn.microsoft.com/en-us/library/ms633582(VS.85).aspx – Josh

0

Nếu biểu mẫu bạn muốn ảnh chụp nhanh giống như biểu mẫu được liên kết với thanh tác vụ, bạn thực sự không cần sử dụng GetforegroundWindow. Chỉ cần sử dụng Form.hWnd và chuyển nó vào hàm nhận snapshot. Bạn có thể cần để làm cho nó cửa sổ đầu bằng cách gọi

[DllImport("user32.dll")] 
public static extern IntPtr SetForegroundWindow(IntPtr hWnd); 

hoặc

[DllImport("user32.dll")] 
public static extern bool BringWindowToTop(HandleRef hWnd); 

Nếu bạn muốn toàn bộ máy tính để bàn, thì có thể bạn chỉ cần đặt trong một Thread.Sleep để đảm bảo foreground cửa sổ đã có đủ để đến đầu trang trước khi nhận được ảnh chụp màn hình máy tính để bàn.

đặt src từ nhận xét của tôi vào đây để in ấn tốt hơn

[DllImport("user32.dll")] 
public static extern IntPtr GetForegroundWindow(); 

[DllImport("user32.dll")] 
public static extern IntPtr GetActiveWindow(); 

// this or the next line not both 
IntPtr curWindow = GetActiveWindow(); 
IntPtr curWindow = GetForegroundWindow(); 

BringWindowToTop(window); 
System.Threading.Thread.Sleep(500); 

Trường hợp spleep chủ đề cung cấp cho các cửa sổ đủ thời gian để đi đến đỉnh của trật tự Z.

+0

Nó không phải là, tôi cần phải lấy một cửa sổ tùy ý mà là trên đầu trang. Cảm ơn mặc dù. –

+0

Hãy nghĩ về một chương trình chụp màn hình mà chỉ cần lấy cửa sổ trên cùng, bất cứ điều gì có thể được. Các máy tính để bàn là dễ dàng và một phần hoạt động tốt hiện nay. –

+0

Tôi cũng sẽ thêm rằng cả cửa sổ GetActiveWindow hoặc GetForegroung đều không hoạt động. Như tôi đã nói trong bài viết đầu tiên của tôi, cửa sổ sẽ không có tiêu điểm. –

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