怎么控制一 exe 软件?

kacy16 2009-06-09 10:40:43
小弟我目前想实现这样一个功能:
有一个叫 Sample.exe的程序(该程序没有代码,也没有任何资料的。),
该软件一个界面,里面有一编辑输入框,有一个按钮。想实现自己写一个程序,该程序可以操纵Sample.exe,可以往该Sample.exe的编辑输入框中输入数据,可以点击按钮的功能。
烦请各位高手提供提供思路。
...全文
52 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccyybn 2011-12-03
  • 打赏
  • 举报
回复
这个帖子让我收获良多
litomboy 2009-06-10
  • 打赏
  • 举报
回复
学习
keanchen0928 2009-06-10
  • 打赏
  • 举报
回复
mark
greatws 2009-06-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 kacy16 的回复:]
现在碰到一问题:

1 我现在是用 CreateProcess 来调用(运行)Sample.exe,可以调用成功,但是用FindWindowEx(NULL,NULL,NULL,"Sample"),获得窗体的句柄不行的?

[/Quote]
FindWindowEx是用来查找子窗口的,查找主窗口用FindWindow
skyxie 2009-06-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 kacy16 的回复:]
现在碰到一问题:

1 我现在是用 CreateProcess 来调用(运行)Sample.exe,可以调用成功,但是用FindWindowEx(NULL,NULL,NULL,"Sample"),获得窗体的句柄不行的?
[/Quote]

用窗口标题不保险,比如中英文的OS可能不同,程序运行时也可能是改变标题

建议使用FindWindowEx 第3个参数,classname进行查找,你可以用spy++看看sample主窗口的classname

kacy16 2009-06-10
  • 打赏
  • 举报
回复
现在碰到一问题:

1 我现在是用 CreateProcess 来调用(运行)Sample.exe,可以调用成功,但是用FindWindowEx(NULL,NULL,NULL,"Sample"),获得窗体的句柄不行的?
kacy16 2009-06-10
  • 打赏
  • 举报
回复
现在正在按照两位高人的思路正在测试,看是否能成功控制这个EXE软件.
zlmzhuanjia 2009-06-10
  • 打赏
  • 举报
回复
up 学习了
dengxuxing 2009-06-10
  • 打赏
  • 举报
回复
强人啊!学习
Fireway2008 2009-06-10
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 kacy16 的回复:]
在各位的帮助下,现在我基本能控制一 exe文件了.但是还有一些小问题:
假如两个编辑框都在同一个GroupBox里面,怎么去区分他们?是否要需要根据control id等信息来判断哪个编辑框?

欢迎大家继续对该问题发表意见,准备过几天才结帖.
[/Quote]

根据控件ID 是最妥当的方法,
不同窗体有可能有相同的ID控件。


就如同2个不同的人,他们身高都是175。
哈利路亚1874 2009-06-10
  • 打赏
  • 举报
回复
二楼正解之一
kacy16 2009-06-10
  • 打赏
  • 举报
回复
在各位的帮助下,现在我基本能控制一 exe文件了.但是还有一些小问题:
假如两个编辑框都在同一个GroupBox里面,怎么去区分他们?是否要需要根据control id等信息来判断哪个编辑框?

欢迎大家继续对该问题发表意见,准备过几天才结帖.
kacy16 2009-06-10
  • 打赏
  • 举报
回复
谢谢 skyxie !

MSDN上的解释是:
The SendMessage function sends the specified message to a window or windows. It calls the window procedure for the specified window and does not return until the window procedure has processed the message.

我的理解:一直等到处理完消息(也就是该消息所对应的函数也执行完毕),SendMessage才返回.所以,用SendMessage可以起到
同步的作用.
skyxie 2009-06-10
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 kacy16 的回复:]
谢谢!用PostMessage问题更大,我是需要Sample.exe中的某个按钮处理完后,我自己才好进行下一步动作。
所以,我想问的是:跨进程的通过SendMessage()来传递消息,也是否等到该消息处理完后才返回呢?
[/Quote]

是的

你可以仔细看看 MSDN SendMessage
kacy16 2009-06-10
  • 打赏
  • 举报
回复
谢谢!用PostMessage问题更大,我是需要Sample.exe中的某个按钮处理完后,我自己才好进行下一步动作。
所以,我想问的是:跨进程的通过SendMessage()来传递消息,也是否等到该消息处理完后才返回呢?
littlefish636 2009-06-10
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 kacy16 的回复:]
我另外有一个疑问:
一般来说,SendMessage()函数是等 该消息 处理完后才返回的?
但是现在是跨进程的通过SendMessage()来传递消息,也是否等到该消息处理完后才返回呢?
例如:
向对话框发送 BN_CLICKED的WM_COMMAND 消息
SendMessage(hDlg, WM_COMMAND, (WPARAM)(BN_CLICKED) …

是否等到该按钮的按击事件处理完才返回?
[/Quote]

PostMessage(hDlg, WM_COMMAND, 按钮ID, 0)...
kacy16 2009-06-10
  • 打赏
  • 举报
回复
我另外有一个疑问:
一般来说,SendMessage()函数是等 该消息 处理完后才返回的?
但是现在是跨进程的通过SendMessage()来传递消息,也是否等到该消息处理完后才返回呢?
例如:
向对话框发送 BN_CLICKED的WM_COMMAND 消息
SendMessage(hDlg, WM_COMMAND, (WPARAM)(BN_CLICKED) …

是否等到该按钮的按击事件处理完才返回?
路人乙2019 2009-06-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 skyxie 的回复:]

1. 得到 主对话框HWND,编辑输入框 / 按钮 的HWND
EnumWindows + FindWindowEx 找到 Sample.exe 的 主对话框HWND (假设为hDlg), 编辑输入框 / 按钮 的HWND (假设为hEdit, hBtn)

2. 模拟输入数据
SendMessage(hEdit, WM_SETTEXT ...)

3. 模拟点击按钮
3.1)
用spy++找到按钮的control ID (假设为nID)
3.2)
向对话框发送 BN_CLICKED的WM_COMMAND 消息
SendMessage(hDlg, WM_COMMAND, (WPARAM)(BN_CLICKED) …
[/Quote]对头.
luckyboy101 2009-06-10
  • 打赏
  • 举报
回复
强,学习
kacy16 2009-06-10
  • 打赏
  • 举报
回复
现在问题大致解决了,
幸好那Sample.exe中的两个 编辑框(TMemo) 分别在 两个 GroupBox 里面,而且这两个 GroupBox有不同的标题,
所以我就容易找到了.我的大致方法如下:

1 先找到一个GroupBox
HWND hGroup1=::FindWindowEx(g_hwndExe,NULL,"TGroupBox","Group1");

2 再去找TMemo
HWND hMemo1=::FindWindowEx(hGroup1,NULL,"TMemo",NULL);

3 然后,这样就往这个编辑框输入了 aryData里面的数据.
::SendMessage(hMemo1,WM_SETTEXT,0,(LPARAM)aryData);

非常谢谢 oyljerry,skyxie,greatws等各位兄弟大力出手相助,
因为现在时间比较紧,所以过一段时间再结帖.

也非常欢迎大家继续讨论该类问题,假如两个编辑框都在同一个GroupBox里面,怎么去区分他们?是否要根据control id等信息?
加载更多回复(9)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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