2012-01-26 6 views
9

के साथ पत्र 'i' भेजना मैंने सी # विंडोज फॉर्म के साथ एक स्क्रीन कीबोर्ड बनाया। मैं कीस्ट्रोक भेजने के लिए Sendkeys.Send() फ़ंक्शन का उपयोग करता हूं। सभी पत्र लेकिन पत्र i ठीक काम करता है। जब मैं कीबोर्ड पर पत्र मैं दबाई जाने वाली माइक्रोसॉफ्ट वर्ड खुला है, भेजता है Ctrl +Alt + मैं और प्रिंट संवाद खोलता है। यह नोटपैड ++ में भी वही है। लेकिन जब मैं नोटपैड में टाइप करने का प्रयास करता हूं तो यह ठीक काम करता है।SendKeys

मेरे कोड में मैं SendKeys.Send(value); के साथ चाबियाँ भेजता हूं जहां मूल्य दबाए गए बटन का टेक्स्ट होता है। मुझे निम्नलिखित कोड के साथ पाठ मिलता है:

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

कोई टिप्पणी नहीं है कि यह ठीक से काम क्यों नहीं करती है?

संपादित करें: मैंने केवल एक बटन के साथ एक नई विंडोज़ फॉर्म प्रोजेक्ट बनाई है और पूरा कोड नीचे है। अभी भी काम नहीं कर रहा है। किसी भी विचार की सराहना की जाएगी।

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; 
      } 
     } 
    } 

ओवरराइड फ़ंक्शन फ़ॉर्म को ध्यान केंद्रित करने से रोकने के लिए है। ताकि मैं अन्य अनुप्रयोगों में कीस्ट्रोक भेज सकूं जिनके पास फोकस है।

+0

यह है एक्स सेकंड के लिए बटन दबाने? 'मान' क्या है, यह कोई कीवर्ड नहीं है? आप कुछ परिश्रम में पाते हैं कि '((MyClass) ऑब्जेक्ट के साथ कास्टिंग करने के बजाय' 'का उपयोग करके कास्टिंग (MyClass के रूप में ऑब्जेक्ट)'। दूसरा क्लास कास्ट अपवाद फेंकने के बजाय, ओबीजे माई क्लास नहीं है, तो शून्य वापस आ जाएगा। – MoonKnight

+0

मुझे बहुत खेद है। यह मूल्य एस के बजाय स्ट्रिंग एस होगा। परिणाम बदलता नहीं है, मैं इसे भी ऐसा करता हूं: Sendkeys.Send ("i"); –

+0

क्या आपने डीबगर का उपयोग यह जांचने के लिए किया था कि मूल्य क्या है? यह आपको समस्या को कम करने में मदद करेगा। –

उत्तर

1

दो विकल्प:

How to: Simulate Mouse and Keyboard Events in Code

इसके अलावा, यहां उदाहरण से कोड है:

यहाँ MSDN पर एक उदाहरण है

1- एक कुंजी दबाने अनुरूपता बताता, देखें http://msdn2.microsoft.com/en-us/library/system.windows.forms.sendkeys(VS.71).aspx

नमूना:

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

2- एक खिड़की के लिए एक महत्वपूर्ण भेजता है, निश्चित रूप से कोड के इस हिस्से पर

[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

आप "SetForegroundWindow" Win32 API विधि को नहीं बुला रहे हैं। इसलिए, आपकी "SendKeys" कॉल संभवतः आपके ऐप पर चाबियाँ भेज रही है, लक्ष्य लक्ष्य के अनुसार नहीं।

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

मैंने अभी अपना आवेदन गैर-प्रयोज्य बनाया है। इसलिए जब मैं अपने आवेदन पर अपने बटन पर क्लिक करता हूं तब भी आखिरी एप्लिकेशन केंद्रित होता है। क्या यह दृष्टिकोण गलत है? यह तब काम करता है जब मैं इसे नोटपैड और वर्डपैड पर आज़माता हूं लेकिन एमएस शब्द और नोटपैड ++ पर काम नहीं करता है –

संबंधित मुद्दे