2010-12-27 36 views
8

Làm cách nào để sử dụng C# hoặc C++, chèn văn bản vào hộp văn bản của một ứng dụng khác? Tôi đã làm điều này một thời gian dài trước đây và dường như nhớ một cái gì đó về việc sử dụng các ứng dụng HWND. Nhưng kể từ khi thay đổi đó cho mọi trường hợp của ứng dụng tôi cảm thấy rằng tôi sẽ không nhớ câu chuyện hoàn chỉnh. Tôi bằng cách nào đó có được một danh sách các ứng dụng đang chạy, trích xuất một trong những tôi muốn, có được HWND từ đó và sau đó ... hmm .... sau đó những gì? :)Chèn văn bản vào hộp văn bản của ứng dụng khác

Trả lời

11

Sử dụng FindWindowEx() để tìm ra xử lý (HWND) và sau đó gửi tin nhắn WM_SETTEXT sử dụng SendMessage()

Khi sử dụng FindWindowEx, trước tiên bạn sẽ cần tìm cửa sổ chính xử lý bằng cách sử dụng tên lớp của nó. Sau đó, bạn sẽ cần phải tìm thấy các xử lý của bất cứ thùng chứa các hộp văn bản là trong, gọi FindWindowEx, đi qua xử lý của phụ huynh (cửa sổ), và tên lớp của container. Bạn sẽ cần phải lặp lại điều này cho đến khi bạn đến hộp văn bản. Bạn có thể sử dụng công cụ được gọi là Spy++ được cài đặt theo mặc định với Visual Studio để kiểm tra ứng dụng đích và tìm ra thứ bậc của vùng chứa (tất cả các đối tượng thực sự được gọi là cửa sổ trong API nhưng tôi gọi chúng là cửa sổ cấp) với tên lớp của họ.

+0

Ngoài ra, bạn có thể cần thêm một cuộc gọi đến InvalidateRect như SendMessage sẽ thay đổi nó và tôi sẽ nhìn thấy giá trị trong Winspector nhưng giá trị về hình thức của tôi vẫn không thay đổi , vì vậy InvalidateRect sẽ gây ra các repaint –

+0

Điều gì xảy ra nếu, ứng dụng có chứa nhiều hơn một hộp văn bản và tôi muốn đọc dữ liệu từ một hộp văn bản cụ thể. Có cách nào để phân biệt xử lý các hộp văn bản không? – MK446

3

Sau đó SendMessage(), WM_SETTEXT

-1

bạn có thể sử dụng lớp Clipboard để đạt được cùng

+0

nhưng điều này sẽ liên quan đến người sử dụng xử lý thay vì thực thi mã – RvdK

-2

Thay vì nhắm mục tiêu một ứng dụng cụ thể, bạn chỉ có thể gửi tổ hợp phím đến trường văn bản.

private void button1_Click(object sender, EventArgs e) 
    { 
     System.Threading.Thread.Sleep(5000); 
     SendKeys.Send(send_text); 

    private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     send_text = textBox1.Text;    
    } 
+0

Vui lòng thêm một số giải thích – CodeWarrior

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