SendKeys.Send 键代码

SendKeys.Send 键代码

使用   SendKeys   将键击和组合键击发送到活动应用程序。此类无法实例化。若要发送一个键击给某个类并立即继续程序流,请使用   Send。若要等待键击启动的任何进程,请使用   SendWait。  
   
  每个键都由一个或多个字符表示。若要指定单个键盘字符,请使用该字符本身。例如,若要表示字母   A,请将字符串“A”传递给方法。若要表示多个字符,请将各个附加字符追加到它之前的字符的后面。若要表示字母   A、B   和   C,请将参数指定为“ABC”。  
   
  加号   (+)、插入符号   (^)、百分号   (%)、波浪号   (~)   以及圆括号   ()   对   SendKeys   具有特殊含义。若要指定这些字符中的某个字符,请将其放在大括号   ({})   内。例如,若要指定加号,请使用“{+}”。若要指定大括号字符,请使用“{{}”和“{}}”。中括号   ([   ])   对   SendKeys   没有特殊含义,但必须将它们放在大括号内。在其他应用程序中,中括号具有特殊含义,此含义可能会在发生动态数据交换   (DDE)   时起重要作用。  
   
  若要指定在按键(如   ENTER   或   TAB)时不显示的字符,以及表示操作而不表示字符的键,请使用下表中的代码:  
   
  键   代码    
  BACKSPACE   {BACKSPACE}、{BS}   或   {BKSP}    
  BREAK   {BREAK}    
  CAPS   LOCK   {CAPSLOCK}    
  DEL   或   DELETE   {DELETE}   或   {DEL}    
  DOWN   ARROW(下箭头键)   {DOWN}    
  END   {END}    
  ENTER   {ENTER}   或   ~    
  ESC   {ESC}    
  HELP   {HELP}    
  HOME   {HOME}    
  INS   或   INSERT   {INSERT}   或   {INS}    
  LEFT   ARROW(左箭头键)   {LEFT}    
  NUM   LOCK   {NUMLOCK}    
  PAGE   DOWN   {PGDN}    
  PAGE   UP   {PGUP}    
  PRINT   SCREEN   {PRTSC}(保留供将来使用)    
  RIGHT   ARROW(右箭头键)   {RIGHT}    
  SCROLL   LOCK   {SCROLLLOCK}    
  TAB   {TAB}    
  UP   ARROW(上箭头键)   {UP}    
  F1   {F1}    
  F2   {F2}    
  F3   {F3}    
  F4   {F4}    
  F5   {F5}    
  F6   {F6}    
  F7   {F7}    
  F8   {F8}    
  F9   {F9}    
  F10   {F10}    
  F11   {F11}    
  F12   {F12}    
  F13   {F13}    
  F14   {F14}    
  F15   {F15}    
  F16   {F16}    
  数字键盘加号   {ADD}    
  数字键盘减号   {SUBTRACT}    
  数字键盘乘号   {MULTIPLY}    
  数字键盘除号   {DIVIDE}    
   
  若要指定与   SHIFT、CTRL   和   ALT   键的任意组合一起使用的键,请在这些键代码之前加上以下一段或多段代码。  
   
  键   代码    
  SHIFT   +    
  CTRL   ^    
  ALT   %    
   
  若要指定在按一些键时应同时按住   SHIFT、CTRL   和   ALT   键的任意组合,请将这些键的代码放在括号内。例如,若要指定按   E   和   C   时同时按住   SHIFT   键,请使用“+(EC)”。若要指定按   E   时应按住   SHIFT,之后按   C   时不按住   SHIFT,请使用“+EC”。  
   
  要指定重复的键,请使用   {键数字}   的形式。键和数字之间必须放一空格。例如,{LEFT   42}   表示按左箭头键   42   次;{h   10}   表示按   H   10   次。  
   
  注意       因为没有可用来激活另一个应用程序的托管方法,所以可以在当前应用程序中使用此类,或使用本机   Windows   方法(如   FindWindow   和   SetForegroundWindow)来强制聚焦到其他应用程序上

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
如果你不知道测试软件的条码框名称,可以使用Windows API来查找测试软件窗口,并获取它的子窗口句柄。然后,可以使用SendMessage或PostMessage函数向该子窗口发送消息,从而将条码发送到测试软件中。具体步骤如下: 1. 使用FindWindow函数查找测试软件的顶层窗口,该函数的第一个参数是窗口类名,第二个参数是窗口标题,可以根据具体情况选择。 ```csharp [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); IntPtr testWnd = FindWindow(null, "测试软件窗口标题"); ``` 2. 使用EnumChildWindows函数列举测试软件窗口的子窗口(即条码框),并找到条码框的句柄。 ```csharp [DllImport("user32.dll", SetLastError = true)] public static extern bool EnumChildWindows(IntPtr hWndParent, EnumChildProc lpEnumFunc, IntPtr lParam); public delegate bool EnumChildProc(IntPtr hwnd, IntPtr lParam); IntPtr testBarcodeWnd = IntPtr.Zero; bool EnumChildProcCallback(IntPtr hwnd, IntPtr lParam) { StringBuilder className = new StringBuilder(256); GetClassName(hwnd, className, className.Capacity); if (className.ToString() == "Edit") { testBarcodeWnd = hwnd; return false; // 找到了,停止遍历 } return true; } EnumChildWindows(testWnd, EnumChildProcCallback, IntPtr.Zero); ``` 其中,EnumChildWindows函数用于列举子窗口,EnumChildProc是一个回调函数,用于处理每个子窗口,GetClassName函数用于获取窗口类名。 在上述代码中,我们遍历测试软件窗口的所有子窗口,查找类名为"Edit"的窗口,即文本框窗口。如果找到了测试软件的条码框,就将它的句柄保存在testBarcodeWnd变量中,并返回false停止遍历。 3. 发送条码到测试软件的条码框中,可以使用SendMessage或PostMessage函数。 ```csharp [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); SendMessage(testBarcodeWnd, WM_SETTEXT, IntPtr.Zero, Marshal.StringToHGlobalAnsi(barcode)); SendMessage(testBarcodeWnd, WM_KEYDOWN, (IntPtr)VK_RETURN, IntPtr.Zero); SendMessage(testBarcodeWnd, WM_KEYUP, (IntPtr)VK_RETURN, IntPtr.Zero); ``` 其中,WM_SETTEXT消息用于设置文本框内容,WM_KEYDOWN和WM_KEYUP消息用于模拟按下和释放Enter。VK_RETURN是Enter的虚拟码。 以上代码中使用的常量和函数需要先声明,可以将它们放在类的静态区域,或者使用using static语句将它们导入到命名空间中。完整代码如下: ```csharp using System; using System.Runtime.InteropServices; using System.Text; public class TestBarcodeSender { const uint WM_SETTEXT = 0x000C; const uint WM_KEYDOWN = 0x0100; const uint WM_KEYUP = 0x0101; const int VK_RETURN = 0x0D; [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", SetLastError = true)] public static extern bool EnumChildWindows(IntPtr hWndParent, EnumChildProc lpEnumFunc, IntPtr lParam); [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, string lParam); [DllImport("user32.dll")] static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem); [DllImport("user32.dll")] static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); public delegate bool EnumChildProc(IntPtr hwnd, IntPtr lParam); public static void SendBarcodeToTestSoftware(string barcode, string testSoftwareWindowTitle) { IntPtr testWnd = FindWindow(null, testSoftwareWindowTitle); if (testWnd != IntPtr.Zero) { IntPtr testBarcodeWnd = IntPtr.Zero; bool EnumChildProcCallback(IntPtr hwnd, IntPtr lParam) { StringBuilder className = new StringBuilder(256); GetClassName(hwnd, className, className.Capacity); if (className.ToString() == "Edit") { testBarcodeWnd = hwnd; return false; // 找到了,停止遍历 } return true; } EnumChildWindows(testWnd, EnumChildProcCallback, IntPtr.Zero); if (testBarcodeWnd != IntPtr.Zero) { SendMessage(testBarcodeWnd, WM_SETTEXT, IntPtr.Zero, Marshal.StringToHGlobalAnsi(barcode)); SendMessage(testBarcodeWnd, WM_KEYDOWN, (IntPtr)VK_RETURN, IntPtr.Zero); SendMessage(testBarcodeWnd, WM_KEYUP, (IntPtr)VK_RETURN, IntPtr.Zero); } else { throw new Exception("未找到测试软件的条码框!"); } } else { throw new Exception("未找到测试软件的主窗口!"); } } } ``` 使用时,直接调用SendBarcodeToTestSoftware方法即可: ```csharp TestBarcodeSender.SendBarcodeToTestSoftware("1234567890", "测试软件窗口标题"); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值