python3.x - 如何用python激活指定窗口的输入框,方便下一步模拟输出?
PHPz
PHPz 2017-04-17 17:18:44
0
2
1671

python3.4
(对win的这种窗口啥的并不熟悉。。刚开始接触。。有些术语可能不准确 见谅)
尝试模拟键盘输入,希望可以自动定位到程序的中某个输入框中,并激活,开始输入。
已经尝试用FindWindow找到窗口的句柄,但似乎并不能直接使其成为当前的工作的那个窗口。我用的一个记事本尝试,

wrHd=win32gui.FindWindow('Notepad','write.txt - 记事本')
win32gui.ShowWindow(wrHd,win32con.SW_SHOWNORMAL)
SendInput()

其中SW_SHOWNORMAL等其他几个常数我都试过了,似乎只有在窗口本身已经最小化的时候才可以把窗口激活?,如果没有最小化的话似乎这个showWindow并没有作用。

啊刚才尝试了用SetForegroundWindow()这个函数似乎可以激活窗口。
所以现在一个窗口如果有多个输入框。。求问如何定位某个特定的框呢

总的来说目标就是希望能完成自动定位,输入,这样。
十分感谢!
PS:如果有系统介绍这方面的书籍或者网站等,比如介绍各个api有啥用的(中文最好,因为不想翻msdn...)请一并推荐上来吧~十分感谢!x2

PHPz
PHPz

学习是最好的投资!

Antworte allen(2)
Peter_Zhu

首先,要明确你的需求,“模拟键盘输入”这个需求有些笼统了,因为Win32上模拟输入的方法实在太多,各有不同的效果。

其次,把焦点移动到文本框并不是必需的。如果你只是想往文本框里输入字符串,你甚至都不需要知道怎么模拟键盘动作,因为Win32提供了更高层次的抽象WM_CHAR。另外一些情况下,你可能希望手动模拟键盘的击键动作WM_KEYDOWNWM_KEYUP,例如你想展现用输入法打字的效果,或者你想调用某个组合键。

关于窗口句柄的获取,Win32里面把控件之类的也称作Window,但是FindWindow()只能查找顶层窗口(也就是狭义的“窗口”),如果需要查找子窗口(也就是通常所说的“控件”),需要用FindWindowEx()

还是以记事本为例:

from ctypes import windll as win32
WM_CHAR = 0x0102

try:
    hWnd = win32.user32.FindWindowW('Notepad', None)
    assert hWnd
    hEdit = win32.user32.FindWindowExW(hWnd, None, 'Edit', None)
    assert hEdit
except AssertionError:
    print('Notepad not found')
else:
    for char in 'Hello, 世界':
        win32.user32.SendMessageW(hEdit, WM_CHAR, ord(char), None)

示例程序运行的效果是:记事本自始至终都没有获得焦点,但是光标处插入了字符串。
在这个应用场景下,模拟键盘敲击并不是一个好的选择——输入的结果完全取决于你的键盘布局/输入法。虽然我国通行US QWERTY键盘,键码和英文字符基本对应,但直接把字符通过窗口消息传递过去,能轻松的保证输入的结果和要求完全一致,何乐而不为呢。

有关Win32的学习,我没有系统的学习过,个人的习惯是看别人做的示例代码,不懂的查MSDN…
国内有很多讲MFC开发的书,一般会讲解有关Win32的基础知识。然而书名里通常不会提到MFC和Win32,而是冠以Visual C++的名号,也是醉了…

无论是什么资料,通常都是面向C/C++环境的,Win32是面向C/C++的,Python只是封装了一下。建议在C/C++平台上学习,会方便许多。
VB/.NET/Delphi的相关资料也比Python多很多,作为一个源于社区的跨平台环境,Win32开发并不是Python的主要战场。

左手右手慢动作

使用纯Windows API来控制窗口的确很灵活,但是需要一定的背景知识,推荐你在网上找一下封装好的自动化操作库,如我知道的:http://pywinauto.github.io/

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage