2009-06-21 32 views
9

Có cách nào sử dụng Win32 hay không, để đăng ký thông báo khi cửa sổ mới được tạo. Tôi đang cố gắng giữ một danh sách các cửa sổ đang mở hiện tại, nhưng bây giờ chỉ cần bỏ phiếu danh sách các cửa sổ hiện tại sử dụng EnumWindows().Làm thế nào tôi có thể được thông báo khi một cửa sổ mới được tạo trên Win32?

Bất kỳ ai cũng làm điều gì đó tương tự?

Cảm ơn


Tôi không chắc chắn nếu tôi đang làm điều này đúng, nhưng tôi không thể có được phương pháp SetWindowsHookEx để bắn.

có điều gì đáng nhớ không?

đây là ảnh chụp của tôi

[DllImport("user32.dll", SetLastError = true)] 
private static extern IntPtr SetWindowsHookEx(HookType hook, HookProc callback, IntPtr hMod, uint dwThreadId); 

[DllImport("user32.dll")] 
private static extern int CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); 
const int HSHELL_WINDOWCREATED = 1; 

private static HookProc winDelegate = ShellHookProcDelegate; 
internal static void RegisterWindowCreatedEvent() 
{ 
    SetWindowsHookEx(HookType.WH_SHELL, winDelegate, IntPtr.Zero, 0); 
} 

private static int ShellHookProcDelegate(int code, IntPtr wParam, IntPtr lParam) 
{ 
    if (code != HSHELL_WINDOWCREATED) 
    { 
     return CallNextHookEx(IntPtr.Zero, code, wParam, lParam); 
    } 

    //App specific code here 

    return CallNextHookEx(IntPtr.Zero, code, wParam, lParam); 
} 
+1

Kể từ WH_SHELL là một móc tiêm, móc của bạn phải cư trú trong một DLL, và các DLL phải là bitness giống như ứng dụng nâng cao sự kiện này. Và kể từ khi bạn đang viết móc của bạn trong mã được quản lý, móc của bạn phải nhắm mục tiêu cùng một phiên bản của CLR khi ứng dụng nâng cao sự kiện. Bất kỳ cái nào trong số đó sẽ ngăn cản móc của bạn chạy. Ngoài ra, hook của bạn chạy trong bối cảnh của ứng dụng nâng cao sự kiện, vì vậy ngay cả khi nó chạy, bạn có thể không nhìn thấy hiệu ứng kể từ khi bạn đang ở trong quá trình sai. Một móc tiếp cận có lẽ là cách tiếp cận tốt nhất ở đây vì nó tránh được tất cả các vấn đề này. –

Trả lời

2

Chắc chắn - bạn có thể viết a CBT hook và xem HCBT_CREATEWND. Xem thêm SetWindowsHookEx().


Lưu ý rằng điều này sẽ cho phép bạn để được thông báo về mọi tạo vật cửa sổ, trước khi cửa sổ được tạo ra được khởi tạo thậm chí hoàn toàn. Nếu tất cả những gì bạn cần là các cửa sổ cấp cao nhất, RichieHindle's suggestion có thể hoạt động tốt hơn ...

0

Detours sẽ cho phép bạn đính kèm móc vào các chức năng Win32 tùy ý. Tuy nhiên, bỏ phiếu có lẽ là một cách đáng tin cậy hơn để tiếp cận vấn đề: bạn không phải lo lắng về việc liệu bạn có bỏ lỡ một phương pháp tạo cửa sổ cụ thể không (bao nhiêu trong Win32? Tôi đặt cược nhiều hơn một)! , tất nhiên, bạn sẽ không được viết lại mã máy cho các chức năng của cửa sổ tại thời gian chạy.

Nhưng bạn biết đấy, cuộc gọi của bạn.

+4

James sẽ phải tiêm mã Detours của mình vào mọi quá trình GUI, bao gồm cả mã mới được bắt đầu. Windows hooks (thông qua SetWindowsHookEx) được thiết kế để làm chính xác những gì anh ta muốn, và là một phần chính thức của Windows API. – RichieHindle

0

Bạn có thể thử thư viện WinEventHook cho autohotkey. Cố gắng sửa đổi notepad chặn popup example như sau:

HookProc(hWinEventHook, Event, hWnd, idObject, idChild, dwEventThread, dwmsEventTime) { if Event ; EVENT_SYSTEM_FOREGROUND = 0x3 {
WinGetTitle, title, ahk_id %hWnd% If (title = "your_window_name" msgbox, your window has been created } }

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