2011-12-22 118 views
8

我想写一个程序,将采取一行数据,并将其传递到另一个窗口/进程。c#发送键盘命令到另一个窗口/进程

这是我到目前为止的代码,但我一直无法解决如何将键盘命令发送到OUTLOOK进程。

我希望能够使用Tab命令/键和输入命令/键。

这是我到目前为止已经试过

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

回答

6

SendMessage是你在找什么。 也许你的问题已经解决了这里:How to send text to Notepad in C#/Win32?

+0

泰的答案,但这不发送键盘命令,据我可以看到它刚刚的过去文本在 – monkeylumps 2011-12-22 15:23:35

+0

您可以为击键设置一个标志。例如。对于Tab键:'SendMessage(hwnd,WM_KEYDOWN,VK_TAB,NULL)' – arminb 2011-12-22 15:28:55

1

考虑,你知道什么键盘命令你要发送到Outlook过程中,你需要使用SendMessage Windows API函数。

只是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(); 
    } 
} 

尝试水木清华这样的。

+4

'SendKeys'无法正常工作。假装其他窗口正在被带到前台。在这种情况下,您会将您的密钥发送给错误的应用程序。 – arminb 2011-12-22 15:04:02

+1

这就是为什么使用SendWait完成然后刷新。 – Elastep 2011-12-22 15:07:00

+0

对不起复活,但任何想法如何我可以做到这一点 - 在互联网上?我需要做基本相同的事情,但目标应用程序/进程正在另一台机器上运行! – pookie 2016-07-25 15:29:38

5

我已经写了几个程序发送击键到背景窗口,我通常实现PostMessage/SendMessage。我记录了我的所有发现here

但是,您基本上会使用低级别的c调用来将消息放入Windows消息队列中,以允许应用程序获取按键。

PostMessage

SendMessage

请让我知道如果你有任何问题,我库是用C#编写,我很乐意分享。这种方法还允许在后台窗口:)鼠标使用

所有代码被签入到GitHub上:https://github.com/EasyAsABC123/Keyboard

相关问题