mfc如何对正在运行着的其它程序的窗口进行操作

时间:2021-05-26 05:36:56
想写一个自动化小软件,就是自动往一个运行的程序的编辑框中输入账号密码,请问我该如何对这个窗口操作,麻烦大家说下思路,拜托啦!

12 个解决方案

#1


模拟键盘操作

#2


引用 1楼笨笨仔 的回复:
模拟键盘操作
麻烦您具体点,谢谢!

#3


FindWindow
然后 SendMessage

#4


1.模拟鼠标键盘输入,类似于按键精灵的形式,优点,代码编写简单,缺点,如果目标窗口被遮挡或最小化,则会模拟失败。

移动鼠标:
SetCursorPos()
模拟点击:
mouse_event()
模拟键盘输入:
keybd_event()
或:
SendInput()

2.发Windows消息,优点,目标窗口被遮挡,最小化,隐藏,也能成功模拟操作,缺点,代码编写较麻烦,需要了解Windows的各种消息,少部分程序由于它做了防范措施,对这些程序模拟无效。

查找目标窗口上的文本框句柄:
FindWindow()
FindWindowEx()
找到文本框句柄后用SendMessage()给它发WM_SETTEXT消息,就实现了给它的文本框输入内容
模拟点击按钮和菜单,就发WM_COMMAND消息,模拟点击鼠标就发WM_LBUTTONDOWN WM_LBUTTONUP消息
模拟键盘就发WM_KEYDOWN WM_KEYUP消息,等等

#5


1、FindWindow找到目标窗口
2、EnumChildWindows或者FindWindowEx找到目标文本输入框窗口,最好配合SPY++工具
3、向文本输入框发送WM_SETTEXT消息

#7


引用 5 楼 lsq19871207 的回复:
1、FindWindow找到目标窗口
2、EnumChildWindows或者FindWindowEx找到目标文本输入框窗口,最好配合SPY++工具
3、向文本输入框发送WM_SETTEXT消息

首先非常感谢您的回答,我按照您的方法做,已经完美解决。但是还有一个小问题,第三步的时候我是定义了一个字符串指针然后用做sendmessage的消息参数,但是如果我定义的是一个CString的对象呢?我该如何把CString对象中的字符发送出去(因为我觉得CString对象对字符串的操作要比简单的字符串方便得多)

#8


引用 7 楼 sinat_30784251 的回复:
Quote: 引用 5 楼 lsq19871207 的回复:

1、FindWindow找到目标窗口
2、EnumChildWindows或者FindWindowEx找到目标文本输入框窗口,最好配合SPY++工具
3、向文本输入框发送WM_SETTEXT消息

首先非常感谢您的回答,我按照您的方法做,已经完美解决。但是还有一个小问题,第三步的时候我是定义了一个字符串指针然后用做sendmessage的消息参数,但是如果我定义的是一个CString的对象呢?我该如何把CString对象中的字符发送出去(因为我觉得CString对象对字符串的操作要比简单的字符串方便得多)


理论上也可以的啊:

CString strUserName = _T("苍老师");
::SendMessage(hWndUserID,WM_SETTEXT,0,(LPARAM)(&strUserName));


但是还是用字符串数组吧,因为msdn上说的很清楚了:
lParam
A pointer to a null-terminated string that is the window text

#9


引用 8 楼 lsq19871207 的回复:
Quote: 引用 7 楼 sinat_30784251 的回复:

Quote: 引用 5 楼 lsq19871207 的回复:

1、FindWindow找到目标窗口
2、EnumChildWindows或者FindWindowEx找到目标文本输入框窗口,最好配合SPY++工具
3、向文本输入框发送WM_SETTEXT消息

首先非常感谢您的回答,我按照您的方法做,已经完美解决。但是还有一个小问题,第三步的时候我是定义了一个字符串指针然后用做sendmessage的消息参数,但是如果我定义的是一个CString的对象呢?我该如何把CString对象中的字符发送出去(因为我觉得CString对象对字符串的操作要比简单的字符串方便得多)


理论上也可以的啊:

CString strUserName = _T("苍老师");
::SendMessage(hWndUserID,WM_SETTEXT,0,(LPARAM)(&strUserName));


但是还是用字符串数组吧,因为msdn上说的很清楚了:
lParam
A pointer to a null-terminated string that is the window text

时间证明确实不行,发送过去的就是乱码了,哈哈!

#10


引用 9 楼 sinat_30784251 的回复:
Quote: 引用 8 楼 lsq19871207 的回复:

Quote: 引用 7 楼 sinat_30784251 的回复:

Quote: 引用 5 楼 lsq19871207 的回复:

1、FindWindow找到目标窗口
2、EnumChildWindows或者FindWindowEx找到目标文本输入框窗口,最好配合SPY++工具
3、向文本输入框发送WM_SETTEXT消息

首先非常感谢您的回答,我按照您的方法做,已经完美解决。但是还有一个小问题,第三步的时候我是定义了一个字符串指针然后用做sendmessage的消息参数,但是如果我定义的是一个CString的对象呢?我该如何把CString对象中的字符发送出去(因为我觉得CString对象对字符串的操作要比简单的字符串方便得多)


理论上也可以的啊:

CString strUserName = _T("苍老师");
::SendMessage(hWndUserID,WM_SETTEXT,0,(LPARAM)(&strUserName));


但是还是用字符串数组吧,因为msdn上说的很清楚了:
lParam
A pointer to a null-terminated string that is the window text

时间证明确实不行,发送过去的就是乱码了,哈哈!


所以说不要异想天开,按msdn上的来。 

#11


引用 10 楼 lsq19871207 的回复:
Quote: 引用 9 楼 sinat_30784251 的回复:

Quote: 引用 8 楼 lsq19871207 的回复:

Quote: 引用 7 楼 sinat_30784251 的回复:

Quote: 引用 5 楼 lsq19871207 的回复:

1、FindWindow找到目标窗口
2、EnumChildWindows或者FindWindowEx找到目标文本输入框窗口,最好配合SPY++工具
3、向文本输入框发送WM_SETTEXT消息

首先非常感谢您的回答,我按照您的方法做,已经完美解决。但是还有一个小问题,第三步的时候我是定义了一个字符串指针然后用做sendmessage的消息参数,但是如果我定义的是一个CString的对象呢?我该如何把CString对象中的字符发送出去(因为我觉得CString对象对字符串的操作要比简单的字符串方便得多)


理论上也可以的啊:

CString strUserName = _T("苍老师");
::SendMessage(hWndUserID,WM_SETTEXT,0,(LPARAM)(&strUserName));


但是还是用字符串数组吧,因为msdn上说的很清楚了:
lParam
A pointer to a null-terminated string that is the window text

时间证明确实不行,发送过去的就是乱码了,哈哈!


所以说不要异想天开,按msdn上的来。 

非常感谢

#12


::SendMessage(hWndUserID,WM_SETTEXT,0,(LPARAM)(LPCTSTR)strUserName);

#1


模拟键盘操作

#2


引用 1楼笨笨仔 的回复:
模拟键盘操作
麻烦您具体点,谢谢!

#3


FindWindow
然后 SendMessage

#4


1.模拟鼠标键盘输入,类似于按键精灵的形式,优点,代码编写简单,缺点,如果目标窗口被遮挡或最小化,则会模拟失败。

移动鼠标:
SetCursorPos()
模拟点击:
mouse_event()
模拟键盘输入:
keybd_event()
或:
SendInput()

2.发Windows消息,优点,目标窗口被遮挡,最小化,隐藏,也能成功模拟操作,缺点,代码编写较麻烦,需要了解Windows的各种消息,少部分程序由于它做了防范措施,对这些程序模拟无效。

查找目标窗口上的文本框句柄:
FindWindow()
FindWindowEx()
找到文本框句柄后用SendMessage()给它发WM_SETTEXT消息,就实现了给它的文本框输入内容
模拟点击按钮和菜单,就发WM_COMMAND消息,模拟点击鼠标就发WM_LBUTTONDOWN WM_LBUTTONUP消息
模拟键盘就发WM_KEYDOWN WM_KEYUP消息,等等

#5


1、FindWindow找到目标窗口
2、EnumChildWindows或者FindWindowEx找到目标文本输入框窗口,最好配合SPY++工具
3、向文本输入框发送WM_SETTEXT消息

#6


#7


引用 5 楼 lsq19871207 的回复:
1、FindWindow找到目标窗口
2、EnumChildWindows或者FindWindowEx找到目标文本输入框窗口,最好配合SPY++工具
3、向文本输入框发送WM_SETTEXT消息

首先非常感谢您的回答,我按照您的方法做,已经完美解决。但是还有一个小问题,第三步的时候我是定义了一个字符串指针然后用做sendmessage的消息参数,但是如果我定义的是一个CString的对象呢?我该如何把CString对象中的字符发送出去(因为我觉得CString对象对字符串的操作要比简单的字符串方便得多)

#8


引用 7 楼 sinat_30784251 的回复:
Quote: 引用 5 楼 lsq19871207 的回复:

1、FindWindow找到目标窗口
2、EnumChildWindows或者FindWindowEx找到目标文本输入框窗口,最好配合SPY++工具
3、向文本输入框发送WM_SETTEXT消息

首先非常感谢您的回答,我按照您的方法做,已经完美解决。但是还有一个小问题,第三步的时候我是定义了一个字符串指针然后用做sendmessage的消息参数,但是如果我定义的是一个CString的对象呢?我该如何把CString对象中的字符发送出去(因为我觉得CString对象对字符串的操作要比简单的字符串方便得多)


理论上也可以的啊:

CString strUserName = _T("苍老师");
::SendMessage(hWndUserID,WM_SETTEXT,0,(LPARAM)(&strUserName));


但是还是用字符串数组吧,因为msdn上说的很清楚了:
lParam
A pointer to a null-terminated string that is the window text

#9


引用 8 楼 lsq19871207 的回复:
Quote: 引用 7 楼 sinat_30784251 的回复:

Quote: 引用 5 楼 lsq19871207 的回复:

1、FindWindow找到目标窗口
2、EnumChildWindows或者FindWindowEx找到目标文本输入框窗口,最好配合SPY++工具
3、向文本输入框发送WM_SETTEXT消息

首先非常感谢您的回答,我按照您的方法做,已经完美解决。但是还有一个小问题,第三步的时候我是定义了一个字符串指针然后用做sendmessage的消息参数,但是如果我定义的是一个CString的对象呢?我该如何把CString对象中的字符发送出去(因为我觉得CString对象对字符串的操作要比简单的字符串方便得多)


理论上也可以的啊:

CString strUserName = _T("苍老师");
::SendMessage(hWndUserID,WM_SETTEXT,0,(LPARAM)(&strUserName));


但是还是用字符串数组吧,因为msdn上说的很清楚了:
lParam
A pointer to a null-terminated string that is the window text

时间证明确实不行,发送过去的就是乱码了,哈哈!

#10


引用 9 楼 sinat_30784251 的回复:
Quote: 引用 8 楼 lsq19871207 的回复:

Quote: 引用 7 楼 sinat_30784251 的回复:

Quote: 引用 5 楼 lsq19871207 的回复:

1、FindWindow找到目标窗口
2、EnumChildWindows或者FindWindowEx找到目标文本输入框窗口,最好配合SPY++工具
3、向文本输入框发送WM_SETTEXT消息

首先非常感谢您的回答,我按照您的方法做,已经完美解决。但是还有一个小问题,第三步的时候我是定义了一个字符串指针然后用做sendmessage的消息参数,但是如果我定义的是一个CString的对象呢?我该如何把CString对象中的字符发送出去(因为我觉得CString对象对字符串的操作要比简单的字符串方便得多)


理论上也可以的啊:

CString strUserName = _T("苍老师");
::SendMessage(hWndUserID,WM_SETTEXT,0,(LPARAM)(&strUserName));


但是还是用字符串数组吧,因为msdn上说的很清楚了:
lParam
A pointer to a null-terminated string that is the window text

时间证明确实不行,发送过去的就是乱码了,哈哈!


所以说不要异想天开,按msdn上的来。 

#11


引用 10 楼 lsq19871207 的回复:
Quote: 引用 9 楼 sinat_30784251 的回复:

Quote: 引用 8 楼 lsq19871207 的回复:

Quote: 引用 7 楼 sinat_30784251 的回复:

Quote: 引用 5 楼 lsq19871207 的回复:

1、FindWindow找到目标窗口
2、EnumChildWindows或者FindWindowEx找到目标文本输入框窗口,最好配合SPY++工具
3、向文本输入框发送WM_SETTEXT消息

首先非常感谢您的回答,我按照您的方法做,已经完美解决。但是还有一个小问题,第三步的时候我是定义了一个字符串指针然后用做sendmessage的消息参数,但是如果我定义的是一个CString的对象呢?我该如何把CString对象中的字符发送出去(因为我觉得CString对象对字符串的操作要比简单的字符串方便得多)


理论上也可以的啊:

CString strUserName = _T("苍老师");
::SendMessage(hWndUserID,WM_SETTEXT,0,(LPARAM)(&strUserName));


但是还是用字符串数组吧,因为msdn上说的很清楚了:
lParam
A pointer to a null-terminated string that is the window text

时间证明确实不行,发送过去的就是乱码了,哈哈!


所以说不要异想天开,按msdn上的来。 

非常感谢

#12


::SendMessage(hWndUserID,WM_SETTEXT,0,(LPARAM)(LPCTSTR)strUserName);