2011-12-22 28 views
8

Tôi đang cố gắng viết một chương trình sẽ lấy một dòng dữ liệu và chuyển nó vào một cửa sổ/quy trình khác.C# Gửi lệnh bàn phím đến một cửa sổ/quy trình khác

Đây là mã tôi có cho đến nay, nhưng tôi đã không thể tìm ra cách tôi sẽ gửi lệnh bàn phím đến quy trình OUTLOOK.

Tôi muốn có thể sử dụng lệnh/phím Tab và phím Enter/phím Enter.

Đây là những gì tôi đã cố gắng cho đến nay

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Threading; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 
using System.Windows.Forms; 

namespace Config 
{ 
    class Program 
    { 
     [STAThread] 
     static void Main(string[] args) 
     { 
      System.Threading.Thread.Sleep(30);//300000 
      TextReader tr = new StreamReader("config.txt"); 
      Clipboard.SetText(tr.ReadLine()); 
      tr.Close(); 

      var proc = Process.GetProcessesByName("OUTLOOK").FirstOrDefault(); 
      if (proc != null && proc.MainWindowHandle != IntPtr.Zero) 
      { 
       SetForegroundWindow(proc.MainWindowHandle); 
       //SendKeys.Send("{ENTER}"); 
       // Clipboard.GetText(); 
      } 
     } 

     [DllImport("user32")] 
     private static extern bool SetForegroundWindow(IntPtr hwnd); 
    } 
} 

Trả lời

6

SendMessage là những gì bạn đang tìm kiếm. Có thể câu hỏi của bạn đã được giải quyết tại đây: How to send text to Notepad in C#/Win32?

+0

Ty cho câu trả lời nhưng điều này không gửi một lệnh bàn phím như xa như tôi có thể nhìn thấy nó chỉ quá khứ văn bản trong – monkeylumps

+0

Bạn có thể đặt cờ cho các lần nhấn phím. Ví dụ. cho phím tab: 'SendMessage (hwnd, WM_KEYDOWN, VK_TAB, NULL)' – arminb

1

Xét rằng bạn biết khi lệnh bàn phím bạn sẽ gửi đến quá trình Outlook, bạn cần phải sử dụng SendMessage chức năng Windows API.

Chỉ cần một sample

7
[DllImport("user32.dll")] 
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

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

public void Start() 
{ 
    IntPtr zero = IntPtr.Zero; 
    for (int i = 0; (i < 60) && (zero == IntPtr.Zero); i++) 
    { 
     Thread.Sleep(500); 
     zero = FindWindow(null, "YourWindowName"); 
    } 
    if (zero != IntPtr.Zero) 
    { 
     SetForegroundWindow(zero); 
     SendKeys.SendWait("{TAB}"); 
     SendKeys.SendWait("{TAB}"); 
     SendKeys.SendWait("{ENTER}"); 
     SendKeys.Flush(); 
    } 
} 

Hãy thử smth như thế này.

+4

'SendKeys' không hoạt động. Giả vờ một cửa sổ khác đang được đưa lên nền trước. Trong trường hợp này, bạn sẽ gửi các khóa của mình đến sai đơn đăng ký. – arminb

+1

Đó là lý do tại sao nó được thực hiện với SendWait và sau đó tuôn ra. – Elastep

+0

Xin lỗi vì sự phục sinh, nhưng bất kỳ ý tưởng làm thế nào tôi có thể làm điều này - trên internet? Tôi cần phải làm cơ bản cùng một điều, nhưng ứng dụng đích/quá trình đang chạy trên một máy khác! – pookie

5

Tôi đã viết một vài chương trình gửi tổ hợp phím đến cửa sổ nền, tôi thường triển khai PostMessage/SendMessage. Tôi đã ghi lại tất cả các phát hiện của mình here!

Nhưng về cơ bản, bạn sẽ sử dụng cuộc gọi c ở mức độ thấp để đặt thư vào hàng đợi thông báo của cửa sổ để cho phép ứng dụng nhận các lần nhấn phím.

PostMessage

SendMessage

Xin vui lòng cho tôi biết nếu bạn có bất kỳ câu hỏi, thư viện của tôi được viết bằng C# và tôi muốn được hạnh phúc để chia sẻ nó. Phương pháp này cũng cho phép sử dụng chuột trong một cửa sổ background :)

Tất cả mã đã được kiểm tra vào GitHub: https://github.com/EasyAsABC123/Keyboard

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