2010-06-15 49 views
28

Tôi muốn mô phỏng F5 nhấn phím trong chương trình C# của tôi, Khi IE đang mở, tôi muốn có thể tự động làm mới trang web của mình và tôi không biết bắt đầu từ đâu.Simulating Key Press C#

cảm ơn,

Dani.

+0

Đây có phải là ứng dụng web hoặc ứng dụng dành cho máy tính để bàn không? – ckramer

+0

Ứng dụng dành cho máy tính để bàn thông thường. – Dani

+0

Trong trường hợp đó tôi nghĩ rằng ông Bondy đã đánh vào móng trên đầu. – ckramer

Trả lời

47

Dưới đây là một ví dụ ...

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

    [STAThread] 
    static void Main() 
    { 
     while(true) 
     { 
      Process [] processes = Process.GetProcessesByName("iexplore"); 

      foreach(Process proc in processes) 
      { 
       SetForegroundWindow(proc.MainWindowHandle); 
       SendKeys.SendWait("{F5}"); 
      } 

      Thread.Sleep(5000); 
     } 
    } 
} 

một tốt hơn một ... ít anoying ...

static class Program 
{ 
    const UInt32 WM_KEYDOWN = 0x0100; 
    const int VK_F5 = 0x74; 

    [DllImport("user32.dll")] 
    static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam); 

    [STAThread] 
    static void Main() 
    { 
     while(true) 
     { 
      Process [] processes = Process.GetProcessesByName("iexplore"); 

      foreach(Process proc in processes) 
       PostMessage(proc.MainWindowHandle, WM_KEYDOWN, VK_F5, 0); 

      Thread.Sleep(5000); 
     } 
    } 
} 
+2

Điều này (đặc biệt là "tốt hơn") đã giúp tôi, +1. Xem câu trả lời của tôi [ở đây] (http://stackoverflow.com/a/16255097/385995) để xem một ví dụ phức tạp hơn cũng liên quan đến các phím bổ trợ. –

9

Bạn có thể sử dụng API Win32 FindWindow hoặc FindWindowEx để tìm tay cầm cửa sổ của trình duyệt đang mở và sau đó chỉ cần gọi SendMessage với WM_KEYDOWN. Thông thường, đơn giản nhất là chỉ cần chuyển chú thích cửa sổ sang FindWindowEx và để nó tìm cửa sổ liên quan xử lý cho bạn.

Nếu bạn đang tự mình bắt đầu quy trình trình duyệt thông qua đối tượng Process process thì bạn có thể sử dụng process.MainWindowHandle thay vì gọi FindWindowEx.

Spy ++ là một công cụ rất hữu ích khi bạn muốn bắt đầu làm việc với các cửa sổ khác. Về cơ bản nó cho phép bạn tìm hiểu hệ thống phân cấp các phần tử giao diện người dùng của một chương trình khác. Bạn cũng có thể theo dõi tất cả các tin nhắn đi vào cửa sổ bạn đang theo dõi. Tôi có thêm thông tin trong this thread.

Các F5 tổ hợp phím có mã này ảo chính:

const int VK_F5 = 0x74; 

Các p/gọi chữ ký cho FindWindowEx trong C# là:

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); 

Bạn có thể p/gọi (mang) Win32 API SendMessage như sau:

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); 

Vì vậy, để tóm tắt lại, bạn gọi FindWindowEx trực tiếp từ mã C# của bạn sau khi có mã trên ở đâu đó bên trong lớp học của bạn. FindWindowEx sẽ trả về một tay cầm cửa sổ. Sau đó, một khi bạn có cửa sổ xử lý, bạn có thể gửi bất kỳ phím tắt (s) vào cửa sổ, hoặc gọi nhiều cuộc gọi API Win32 khác trên cửa sổ xử lý. Hoặc thậm chí tìm thấy cửa sổ con bằng cách sử dụng một cuộc gọi khác đến FindWindowEx. Ví dụ bạn có thể chọn điều khiển chỉnh sửa của trình duyệt ngay cả và sau đó thay đổi văn bản của nó.

Nếu mọi thứ khác sai và bạn cho rằng bạn đang gửi đúng khóa vào cửa sổ, bạn có thể sử dụng spy++ để xem thư nào được gửi đến cửa sổ khi bạn đặt trọng tâm vào trình duyệt và nhấn F5 theo cách thủ công.

+0

Bạn có thể được chi tiết hơn xin vui lòng, tôi thực sự không biết làm thế nào để sử dụng Win32 API. – Dani

+1

Liên kết đến chuỗi SO khá hoàn hảo. Nhưng cũng có lẽ đoạn trích này có thể giúp ích - http://snippets.dzone.com/posts/show/4070 – Reddog

+0

@Dani: Tôi đã thêm thông tin khác, nhưng bạn có thể tìm kiếm tìm kiếm mã Google bằng ngôn ngữ: C# để biết các ví dụ chi tiết hơn. http://www.google.com/codesearch?q=lang:c%23+FindWindowEx&hl=vi&btnG=Search+Code –

4

Một giải pháp thay thế khác để mô phỏng F5 nhấn phím sẽ đơn giản là lưu trữ điều khiển WebBrowser trong ứng dụng Biểu mẫu cửa sổ. Bạn sử dụng phương thức WebBrowser.Navigate để tải trang web của mình và sau đó sử dụng tiêu chuẩn Timer và trên mỗi đánh dấu của bộ hẹn giờ, bạn chỉ cần điều hướng đến url sẽ tải lại trang.

+0

Giải pháp rất đơn giản của nó. cảm ơn – Dani

2

Thay vì buộc một F5 bấm phím khi bạn chỉ cần cố gắng để có được trang để postback, bạn có thể gọi một postback dựa trên một sự kiện JS (thậm chí MouseMove hoặc timer_tick nếu bạn muốn nó để bắn tất cả thời gian). Sử dụng mã số tại http://weblogs.asp.net/mnolton/archive/2003/06/04/8260.aspx làm tài liệu tham khảo.

2

Cách dễ nhất để gửi (mô phỏng) KeyStrokes tới bất kỳ cửa sổ nào là sử dụng phương thức SendKeys.Send của .NET Framework.

Thanh toán bài viết MSDN rất trực quan này http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx


Riêng đối với trường hợp của bạn, nếu cửa sổ trình duyệt của bạn là ở tập trung, gửi F5 sẽ chỉ liên quan đến các dòng mã sau đây:

SendKeys.Send("{F5}"); 
+0

SendKeys không được xác định –

4

Simple một, thêm trước Chính

[DllImport("USER32.DLL", CharSet = CharSet.Unicode)] 
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 
[DllImport("USER32.DLL")] 
public static extern bool SetForegroundWindow(IntPtr hWnd); 

Mã insid e Main/Phương pháp:

string className = "IEFrame"; 
string windowName = "New Tab - Windows Internet Explorer"; 
IntPtr IE = FindWindow(className, windowName); 
if (IE == IntPtr.Zero) 
{ 
    return; 
} 
SetForegroundWindow(IE); 
InputSimulator.SimulateKeyPress(VirtualKeyCode.F5); 

Lưu ý:

  1. Thêm InputSimulator như tài liệu tham khảo. Để tải xuống Click here

  2. Để tìm Class & Tên cửa sổ, hãy sử dụng WinSpy ++. Để tải xuống Click here

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