c#中如何使用windows API向指定窗口发送按键消息?

永远的小鱼 2013-02-27 11:12:26
我电脑上打开多个计算器

Process[] ProcessList = Process.GetProcessesByName("calc");

IntPtr calc = ProcessList[0].MainWindowHandle;//获取第一个打开的计算器

--------------------------------------------------------------------------
IntPtr htextbox = FindWindowEx(calc, IntPtr.Zero, null, "=");
SendMessage(htextbox, ControlDLL.WM_LBUTTONDOWN, IntPtr.Zero, null);
SendMessage(htextbox, ControlDLL.WM_LBUTTONUP, IntPtr.Zero, null);
------↑上面这么写可以实现 自动的按计算器上面的那个等号按钮↑-----------
--------------------------------------------------------------------------

但是问题来了,很多的程序,他们的按钮都是图片,也很难用FindWindowEx去获取,
但是他们都有自己的快捷键,比如 enter键,以及组合键Alt+A等等。

很多人说可以使用c#中的 SendKey方法啊,但是这个方法好像只对当前活动窗口有用,


听说 使用 SendMessage 可以实现向窗口发送按键,但是很多方法都试过了 均不好用,
特此来求教大家。


1.如何使用SendMessage 向计算器窗口发送 Enter按键,此窗口不是活动窗口
...全文
3138 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
wflpeng 2014-12-10
  • 打赏
  • 举报
回复
求源码啊啊啊
happylvlv 2013-12-03
  • 打赏
  • 举报
回复
试试看使用BM_CLICK代替WM_LBUTTONDOWN,WM_LBUTTONUP
lvtao163163 2013-10-30
  • 打赏
  • 举报
回复
若是游戏程序,建议更新系统到win7,64系统以上,spy++,中winwdows proc不可用,若可用,就弄个钩子程序设个热键(网上有)。键盘钩子代码如下:LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam) { if( ((DWORD)lParam&0x40000000) && (HC_ACTION==nCode) ) //有键按下 { if( wParam==0x78 )//按f9激活 { HWND m_h; m_h=GetActiveWindow(); ::PostMessage(m_h,//添加自己想发的消息查下就会了 } } return CallNextHookEx( glhHook, nCode, wParam, lParam ); }
lwxshlcx 2013-09-02
  • 打赏
  • 举报
回复
顶顶顶!!!同问
lianshuaike2 2013-05-28
  • 打赏
  • 举报
回复
顶一下 同问
lcj_net 2013-05-27
  • 打赏
  • 举报
回复
帮顶一下,同问
soisweetxk 2013-04-08
  • 打赏
  • 举报
回复
引用 15 楼 zh383603842 的回复:
楼上的亲 激活窗口句柄的话 这个窗口不就置顶了么。。。我如果在干别的 会不会弹出来了?
把你的窗口最小化,执行setforegrunndwindow是不会弹出来的,按你的要求可以实现 第一步: 找到外部程序的窗口句柄 第二步: 用setforegroundwindow置前该窗口 第三步: sendkeys.sendwait+发送的快捷键,比如说保存的快捷键为^s(保存)
永远的小鱼 2013-03-15
  • 打赏
  • 举报
回复
永远的小鱼 2013-03-14
  • 打赏
  • 举报
回复
求 代码 求答案
永远的小鱼 2013-03-13
  • 打赏
  • 举报
回复
Lyons 2013-03-12
  • 打赏
  • 举报
回复
永远的小鱼 2013-03-12
  • 打赏
  • 举报
回复
永远的小鱼 2013-03-11
  • 打赏
  • 举报
回复
永远的小鱼 2013-03-08
  • 打赏
  • 举报
回复
amu0528 2013-03-05
  • 打赏
  • 举报
回复
keybd_event(16,0,0,0); //按下Shift键 自己找下 Ctrl+I 对应码
永远的小鱼 2013-03-05
  • 打赏
  • 举报
回复
谁能给一行最重要的代码啊 Process[] ProcessList = Process.GetProcessesByName("mspaint");//画图板 IntPtr test = ProcessList[0].MainWindowHandle; //修改画图板的 标题 可以修改成功 ControlDLL.SendMessage(test, ControlDLL.WM_SETTEXT, IntPtr.Zero, "tttt"); ↓ 现在我想使用SendMessage 发送快捷键Ctrl+I到程序中 该怎么做?
lshfong 2013-03-04
  • 打赏
  • 举报
回复
先取到窗口的句柄,然后发送消息
永远的小鱼 2013-03-04
  • 打赏
  • 举报
回复
永远的小鱼 2013-03-04
  • 打赏
  • 举报
回复
楼上的亲 激活窗口句柄的话 这个窗口不就置顶了么。。。我如果在干别的 会不会弹出来了?
永远的小鱼 2013-02-28
  • 打赏
  • 举报
回复
来人呐
加载更多回复(13)

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧