向外部程序发送按键(或组合键)

向外部程序发送按键(或组合键)

我想在A程序正常操作时,由我的程序C向最小化的B程序发送按键或组合键
(譬如在使用Word时,有一个最小化到任务栏上的IE窗口,我想刷新(F5)或保存(CTRL+S)它)

我的想法是,先找到窗口的句柄,然后用Sendmessage向该窗口发送按键消息:

  1. int WM_KEYDOWN = 0X100;//按键按下时
  2. int WM_KEYUP = 0X101;//按键放开时
  3. int WM_SYSCHAR = 0X106;
  4. int WM_SYSKEYUP = 0X105;
  5. int WM_SYSKEYDOWN = 0X104;//按键按下时,且ALT键也被按着
  6. int WM_CHAR = 0X102;//按键按下时
  7.  
  8. SendMessage(lhwnd,WM_SYSKEYDOWN,0,0);//AlT按下,lhwnd为查找到的其它窗口句柄。
  9. SendMessage(lhwnd,WM_KEYDOWN,83,0);//S键按下。
  10. SendMessage(lhwnd,WM_KEYUP,83,0);
  11. SendMessage(lhwnd,WM_SYSKEYUP,0,0);
但实际运行起来时却发现目标窗口根本没收到~
感觉自己的想法还是可行的,只是什么地方操作有问题~~

======================================================

将notepad最小化,可以发送。
  1. [DllImport("user32")]  
  2. public static extern unsafe int FindWindow(string sClassName, string WindowName);  
  3. [DllImport("user32")]  
  4. public static extern unsafe bool SetForegroundWindow(int hWnd);
  5.  
  6. private bool AppActivate(string sWindowName)
  7. {
  8.     int hwind = FindWindow(null, sWindowName);
  9.     if(hwind == 0)
  10.         return false;
  11.     SetForegroundWindow(hwind);
  12.     return true;
  13. }
  14.  
  15. if(AppActivate("notepad"))  
  16. {
  17.     System.Windows.Forms.SendKeys.SendWait("%(f)o");
  18.     //....
  19. }

how to use keybd_event in C#

  1. using System;
  2. using System.Runtime.InteropServices;
  3. using System.Text;
  4.  
  5. namespace ConsoleApplication8{
  6.     class Class1{
  7.     [STAThread]
  8.         static void Main(string[] args){
  9.             // Display current status of keys.
  10.             Console.WriteLine(
  11.                 "**BEFORE**/r/nCAP: {0}/r/nSCR: {1}/r/nNUM: {2}",
  12.                 Keyboard.GetState(VirtualKeys.VK_CAPITAL)?"ON":"OFF",
  13.                 Keyboard.GetState(VirtualKeys.VK_SCROLL)?"ON":"OFF",
  14.                 Keyboard.GetState(VirtualKeys.VK_NUMLOCK)?"ON":"OFF"
  15.             );
  16.             //Toggle all the keys:
  17.             Keyboard.SetState(VirtualKeys.VK_CAPITAL, !Keyboard.GetState(VirtualKeys.VK_CAPITAL));
  18.             Keyboard.SetState(VirtualKeys.VK_SCROLL, !Keyboard.GetState(VirtualKeys.VK_SCROLL));
  19.             Keyboard.SetState(VirtualKeys.VK_NUMLOCK, !Keyboard.GetState(VirtualKeys.VK_NUMLOCK));
  20.             // Display new status of keys.
  21.             Console.WriteLine(
  22.                 "/r/n**AFTER**/r/nCAP: {0}/r/nSCR: {1}/r/nNUM: {2}",
  23.                 Keyboard.GetState(VirtualKeys.VK_CAPITAL)?"ON":"OFF",
  24.                 Keyboard.GetState(VirtualKeys.VK_SCROLL)?"ON":"OFF",
  25.                 Keyboard.GetState(VirtualKeys.VK_NUMLOCK)?"ON":"OFF"
  26.             );
  27.             Console.ReadLine();
  28.         }
  29.     }
  30.  
  31.     public enum VirtualKeys: byte{
  32.         VK_NUMLOCK = 0x90,
  33.         VK_SCROLL = 0x91,
  34.         VK_CAPITAL = 0x14
  35.     }
  36.  
  37.     class Keyboard{
  38.         const uint KEYEVENTF_EXTENDEDKEY = 0x1;
  39.         const uint KEYEVENTF_KEYUP = 0x2;
  40.  
  41.         [DllImport("user32.dll")]
  42.         static extern short GetKeyState(int nVirtKey);
  43.         [DllImport("user32.dll")]
  44.         static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
  45.  
  46.         public static bool GetState(VirtualKeys Key){
  47.             return (GetKeyState((int)Key)==1);
  48.         }
  49.  
  50.         public static void SetState(VirtualKeys Key, bool State){
  51.             if(State!=GetState(Key)){
  52.                 keybd_event((byte)Key, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0);
  53.                 keybd_event((byte)Key, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
  54.             }
  55.         }
  56.     }
  57. }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值