2010-11-05 27 views
7

Đây phải là một cách dễ dàng: Tôi đang tạo một chương trình sinh ra một quá trình bằng cách sử dụng hàm win32 CreateProcess(). Khi quá trình này được tải, tôi tìm thấy cửa sổ của nó bằng cách sử dụng FindWindow và gửi tin nhắn bằng cách sử dụng SendMessage(). Câu hỏi là, làm cách nào để biết khi nào cửa sổ đó sẵn sàng chấp nhận tin nhắn?Làm thế nào để xác định khi nào quá trình sinh sản đã sẵn sàng? (Sử dụng CreateProcess() và FindWindow())

xem xét như sau:

HWND wnd; 

BOOL Start() 
{ 
    // Spawn the process 
    if (! CreateProcess(...)) 
    return FALSE; 

    // Find the process's window (class and name already known) 
    wnd = FindWindow(MY_WINDOW_CLASS, MY_WINDOW_NAME); 

    // Always returns FALSE because window has not yet been created. 
    return (wnd != NULL); 
} 

Đoạn mã trên sẽ (? Hầu như) luôn luôn thất bại; cửa sổ không thể được tạo ra và thấy rằng một cách nhanh chóng. Nếu tôi đặt một chuỗi chờ, hãy nói Sleep(1000), giữa các cuộc gọi CreateProcessFindWindow, nó hoạt động tốt. Nhưng điều này có cảm giác giống như một hack rất.

Làm cách nào để cải thiện điều này?

Trả lời

9

(Chỉnh sửa): User IInspectable chỉ ra các vấn đề với WaitForInputIdle() và được đề xuất CBT Hooks thay thế.

(...) chức năng gọi lại được sử dụng với chức năng SetWindowsHookEx . Hệ thống gọi hàm này trước khi kích hoạt, tạo, (...) cửa sổ; (... nhiều thứ khác).

Ngoài ra, CBT là viết tắt của đào tạo dựa trên máy tính, vì bất kỳ lý do gì.

(Cũ, hãy cẩn thận, xem nhận xét.) Bạn đang tìm kiếm WaitForInputIdle(). Trích:

Khi một quá trình cha mẹ tạo ra một quá trình con , hàm CreateProcess lợi nhuận mà không cần chờ cho quá trình con để kết thúc khởi tạo của nó. Trước khi cố gắng liên lạc với quy trình con , quy trình cha mẹ có thể sử dụng chức năng WaitForInputIdle để xác định thời điểm khởi tạo của trẻ.

+0

Hoàn hảo. Cảm ơn bạn! –

+2

API Windows rất lớn không ai có thể mong đợi để biết tất cả.Tôi đã học được điều gì đó mới mẻ hôm nay, cảm ơn. –

+1

Đây là lỗi đang chờ xảy ra. 'WaitForInputIdle' được phát minh để đáp ứng các yêu cầu của DDE. Sử dụng nó cho bất cứ điều gì khác sẽ thất bại, theo những cách tinh tế nhất. Đọc có liên quan: [WaitForInputIdle thực sự nên được gọi là WaitForProcessStartupComplete] (https://blogs.msdn.microsoft.com/oldnewthing/20100325-00/?p=14493) và [WaitForInputIdle đợi bất kỳ chuỗi nào, có thể không phải là chuỗi bạn quan tâm đến] (https://blogs.msdn.microsoft.com/oldnewthing/20100326-00/?p=14483). – IInspectable

1

Nếu quá trình bạn đang bắt đầu là quy trình bạn có thể thay đổi, hãy gửi lại thư cho cha mẹ khi nó sẵn sàng. Bạn có thể chuyển HWND của phụ huynh dưới dạng tham số dòng lệnh hoặc sử dụng FindWindow nếu bạn có thể đảm bảo rằng phụ huynh sẽ là duy nhất.

2

Bạn đã xem WaitForInputIdle chưa?

+0

[Tôi có] (http://stackoverflow.com/a/33410894/1889329). Nó chắc chắn không phải những gì bạn muốn sử dụng. – IInspectable

1

Tôi giả sử rằng mã nguồn của cả hai quy trình nằm dưới sự kiểm soát của bạn.

  • Bạn có thể để quy trình thứ hai đăng thông báo lên thư đầu tiên khi sẵn sàng, nếu thứ hai biết chi tiết cần thiết về cửa sổ thông báo của quá trình đầu tiên.
  • Hoặc bạn có thể đợi trong quy trình đầu tiên cho một đối tượng đồng bộ hóa có tên thỏa thuận, như sự kiện hoặc mutex, được đặt từ quy trình thứ hai.
Các vấn đề liên quan