2012-01-26 36 views
9

Tôi đã tạo một bàn phím trên màn hình với C# Windows Forms. Tôi sử dụng chức năng Sendkeys.Send() để gửi các lần nhấn phím. Tất cả các chữ cái nhưng chữ cái i hoạt động tốt. Khi tôi bấm chữ cái i trên bàn phím khi Microsoft Word mở, nó sẽ gửi Ctrl + Alt + I và mở hộp thoại in. Nó cũng tương tự như Notepad ++. Nhưng nó hoạt động tốt khi tôi cố gắng gõ vào notepad.Gửi thư 'i' bằng SendKeys

Trong mã của tôi, tôi gửi các phím với SendKeys.Send(value); nơi giá trị là nội dung của nút được nhấn. Tôi nhận được văn bản có mã sau:

string s = ((Button)sender).Text; 

Mọi nhận xét về lý do tại sao nó không hoạt động bình thường?

Edit: Tôi đã tạo ra một dự án cửa sổ hình thức mới chỉ với một nút và toàn bộ mã dưới đây. Vẫn không làm việc. Bất kỳ ý tưởng nào cũng sẽ được đánh giá cao.

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      SendKeys.Send("i"); 
     } 

     // Prevent form being focused 
     const int WS_EX_NOACTIVATE = 0x8000000; 
     protected override CreateParams CreateParams 
     { 
      get 
      { 
       CreateParams ret = base.CreateParams; 
       ret.ExStyle |= WS_EX_NOACTIVATE; 
       return ret; 
      } 
     } 
    } 

Chức năng ghi đè là ngăn mẫu được tập trung. Để tôi có thể gửi các tổ hợp phím đến ứng dụng khác có tiêu điểm.

+0

Có chắc chắn ở phần này của mã? 'Giá trị' là gì, đây không phải là một từ khóa? Bạn có thể trong một số cercumstance thấy rằng thay vì đúc với '((MyClass) đối tượng)' mà đúc bằng cách sử dụng '(đối tượng như MyClass)'. Thứ hai sẽ trả về null nếu obj không phải là một MyClass, chứ không phải là ném một lớp ngoại lệ. – MoonKnight

+0

Im xin lỗi. nó sẽ là chuỗi s thay vì giá trị s.The kết quả không thay đổi ngay cả tôi làm điều đó như thế này: Sendkeys.Send ("i"); –

+0

Bạn đã sử dụng trình gỡ rối để kiểm tra giá trị 's' đang nhận được chưa? Điều này sẽ giúp bạn thu hẹp vấn đề. –

Trả lời

1

Hai lựa chọn:

1- Mô phỏng một phím nhấn, xem http://msdn2.microsoft.com/en-us/library/system.windows.forms.sendkeys(VS.71).aspx

mẫu:

public static void ManagedSendKeys(string keys) 
     { 
      SendKeys.SendWait(keys); 
      SendKeys.Flush(); 
     } 

2- Gửi một chìa khóa cho một cửa sổ, nhấn nút cho x giây

[DllImport("user32.dll")] 
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo); 
public static void KeyboardEvent(Keys key, IntPtr windowHandler, int delay) 
     { 
      const int KEYEVENTF_EXTENDEDKEY = 0x1; 
      const int KEYEVENTF_KEYUP = 0x2; 
      keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0); 
      Thread.Sleep(delay); 
      keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0); 
     } 
0

của bạn không gọi "SetForegroundWindow" phương pháp Win32 API. Do đó, cuộc gọi "SendKeys" của bạn có khả năng gửi các khóa đến ứng dụng của bạn, chứ không phải ứng dụng đích như dự định.

Dưới đây là một ví dụ trên MSDN:

How to: Simulate Mouse and Keyboard Events in Code

Ngoài ra, đây là các mã từ ví dụ:

using System; 
using System.Runtime.InteropServices; 
using System.Drawing; 
using System.Windows.Forms; 

namespace SimulateKeyPress 
{ 
    class Form1 : Form 
    { 
     private Button button1 = new Button(); 

     [STAThread] 
     public static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.Run(new Form1()); 
     } 

     public Form1() 
     { 
      button1.Location = new Point(10, 10); 
      button1.TabIndex = 0; 
      button1.Text = "Click to automate Calculator"; 
      button1.AutoSize = true; 
      button1.Click += new EventHandler(button1_Click); 

      this.DoubleClick += new EventHandler(Form1_DoubleClick); 
      this.Controls.Add(button1); 
     } 

     // Get a handle to an application window. 
     [DllImport("USER32.DLL", CharSet = CharSet.Unicode)] 
     public static extern IntPtr FindWindow(string lpClassName, 
      string lpWindowName); 

     // Activate an application window. 
     [DllImport("USER32.DLL")] 
     public static extern bool SetForegroundWindow(IntPtr hWnd); 

     // Send a series of key presses to the Calculator application. 
     private void button1_Click(object sender, EventArgs e) 
     { 
      // Get a handle to the Calculator application. The window class 
      // and window name were obtained using the Spy++ tool. 
      IntPtr calculatorHandle = FindWindow("CalcFrame","Calculator"); 

      // Verify that Calculator is a running process. 
      if (calculatorHandle == IntPtr.Zero) 
      { 
       MessageBox.Show("Calculator is not running."); 
       return; 
      } 

      // Make Calculator the foreground application and send it 
      // a set of calculations. 
      SetForegroundWindow(calculatorHandle); 
      SendKeys.SendWait("111"); 
      SendKeys.SendWait("*"); 
      SendKeys.SendWait("11"); 
      SendKeys.SendWait("="); 
     } 

     // Send a key to the button when the user double-clicks anywhere 
     // on the form. 
     private void Form1_DoubleClick(object sender, EventArgs e) 
     { 
      // Send the enter key to the button, which raises the click 
      // event for the button. This works because the tab stop of 
      // the button is 0. 
      SendKeys.Send("{ENTER}"); 
     } 
    } 
} 
+0

Tôi vừa làm cho ứng dụng của tôi không tập trung được. Vì vậy, luôn luôn ứng dụng cuối cùng được tập trung ngay cả sau khi tôi nhấp vào nút của tôi trên ứng dụng của tôi. Cách tiếp cận này có sai không? Nó hoạt động khi tôi thử nó trên notepad và wordpad nhưng không hoạt động trên ms word và notepad ++ –

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