Windows下向指定窗口模拟发送键盘消息

20 篇文章 1 订阅
17 篇文章 1 订阅

在操作系统中,鼠标和键盘的操作会被转换为相应的系统消息,窗口过程在接收到消息后会进行对应的处理。发送消息,我们可以使用SendMessage()和PostMessage(),所以,只要使用这两个函数来发送鼠标和键盘的相关消息就可以了。此外,还可以通过keybd_event()和mouse_event()两个专用的函数进行鼠标和键盘按键的模拟操作。

下面是一个简单的向指定窗口发送消息的例子:

1.新建一个MFC基于Dialog的项目,界面如下:


设置窗口标题编辑框的ID为:IDC_EDIT_CAPTION,绑定成员变量:m_StrCaption;

设置刷新频率编辑框的ID为:IDC_EDIT_INTERVAL;

设置开始按钮的ID为:IDC_BTN_START,绑定成员控件:m_Start。

2.完成按钮点击事件的代码如下:

voidCMyDlg::OnBtnStart()

{   

 

      CString strBtn;

      int nInterval = 0;

      //获取窗口标题

      GetDlgItemText(IDC_EDIT_CAPTION,m_StrCaption);

      //获取输入的刷新频率

      nInterval =GetDlgItemInt(IDC_EDIT_INTERVAL,FALSE, TRUE);

 

      //判断输入是否为非法

      if(m_StrCaption == " " ||nInterval == 0)

      {

     

           return;

      }

 

      //获取按钮的标题

      m_Start.GetWindowText(strBtn);

 

      if(strBtn == "开始")

      {

           //设置定时器

           SetTimer(1, nInterval * 1000, NULL);

           m_Start.SetWindowText("停止");

           GetDlgItem(IDC_EDIT_CAPTION)->EnableWindow(FALSE);

           GetDlgItem(IDC_EDIT_INTERVAL)->EnableWindow(FALSE);

      }else{//MessageBox("jieshu");

           //结束定时器

           KillTimer(1);

           m_Start.SetWindowText("开始");

           GetDlgItem(IDC_EDIT_CAPTION)->EnableWindow(TRUE);

           GetDlgItem(IDC_EDIT_INTERVAL)->EnableWindow(TRUE);

      }

}

3.工程名Dlg.h文件中,添加成员函数:


4.实现添加的成员函数:

voidCMyDlg::OnTimer(UINT nIDEvent)

{

          //根据窗口标题获得窗口句柄

      HWND hWnd =::FindWindow(NULL,m_StrCaption.GetBuffer(0));

      //发送键盘按下,此处模拟F5键

      ::PostMessage(hWnd, WM_KEYDOWN, VK_F5, 1);

      Sleep(100);

      //发送键盘弹起

      ::PostMessage(hWnd, WM_KEYUP, VK_F5, 1);

 

      CDialog::OnTimer(nIDEvent);

}

5.在工程名Dlg.cpp文件中,添加消息映射,将消息和对应的处理函数关联起来:


注:Timer的对应消息是WM_TIMER。

至此,这个简单的小项目就完成了。要获得一个窗口的标题,向大家介绍spy++,用法可以在网上搜。下面是获得浏览器标题的画面:


通过获得指定窗口的标题,就可以向该窗口发送各种信息。运行我们写好的程序设置相应的字段后,就可以看到指定的浏览器窗口每个一段时间将进行一次刷新(因为我们模拟了F5键的消息)。

程序源码:

http://pan.baidu.com/s/1dFv2xyh



  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果你想将模拟键盘输入发送指定的位置,可以使用Windows API函数`SetForegroundWindow`和`SendInput`。以下是一个示例代码,它将模拟按下"Hello World"键,并将其发送指定的文本框中: ```csharp using System; using System.Diagnostics; using System.Runtime.InteropServices; // 设置前台窗口模拟键盘输入 [DllImport("user32.dll")] private static extern bool SetForegroundWindow(IntPtr hWnd); [DllImport("user32.dll")] private static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize); private const int INPUT_KEYBOARD = 1; private const uint KEYEVENTF_EXTENDEDKEY = 0x0001; private const uint KEYEVENTF_KEYUP = 0x0002; [StructLayout(LayoutKind.Sequential)] private struct INPUT { public int type; public INPUTUNION union; } [StructLayout(LayoutKind.Explicit)] private struct INPUTUNION { [FieldOffset(0)] public KEYBDINPUT keyboardInput; } [StructLayout(LayoutKind.Sequential)] private struct KEYBDINPUT { public ushort wVk; public ushort wScan; public uint dwFlags; public uint time; public IntPtr dwExtraInfo; } // 获取窗口句柄 Process process = Process.GetProcessesByName("YourProcessName")[0]; IntPtr hwnd = process.MainWindowHandle; // 设置前台窗口 SetForegroundWindow(hwnd); // 模拟键盘输入 string text = "Hello World"; foreach (char c in text) { INPUT[] inputs = new INPUT[2]; inputs[0].type = INPUT_KEYBOARD; inputs[0].union.keyboardInput.wVk = 0; inputs[0].union.keyboardInput.wScan = (ushort)c; inputs[0].union.keyboardInput.dwFlags = KEYEVENTF_UNICODE; inputs[0].union.keyboardInput.time = 0; inputs[0].union.keyboardInput.dwExtraInfo = IntPtr.Zero; inputs[1].type = INPUT_KEYBOARD; inputs[1].union.keyboardInput.wVk = 0; inputs[1].union.keyboardInput.wScan = (ushort)c; inputs[1].union.keyboardInput.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP; inputs[1].union.keyboardInput.time = 0; inputs[1].union.keyboardInput.dwExtraInfo = IntPtr.Zero; SendInput(2, inputs, Marshal.SizeOf(typeof(INPUT))); } ``` 在代码中,我们首先使用`GetProcessesByName`函数获取指定进程的句柄,然后使用`SetForegroundWindow`函数将其设置为前台窗口。接下来,我们使用`SendInput`函数模拟键盘输入,将每个字符一个接一个地发送指定的文本框中。你可以根据需要修改代码以适应你的应用程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值