使用Python语言控制其他进程窗口的输入法

Python/PHP/Perl 开发与设计
回复
头像
oneleaf
论坛管理员
帖子: 10306
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04
送出感谢: 7 次
接收感谢: 112 次

使用Python语言控制其他进程窗口的输入法

#1

帖子 oneleaf » 2015-01-23 10:18

由于网上的资料比较少,写了一个放出来。

代码: 全选

#coding=utf-8
from ctypes import *
from ctypes.wintypes import BOOL, HWND, LPARAM, HKL
import _winreg

hwnd = windll.user32.FindWindowA('Notepad',None)
print "hwnd:", hwnd

windll.user32.SetForegroundWindow(hwnd)

editHwnd = 0

@WINFUNCTYPE(BOOL, HWND, LPARAM)
def print_title(hwnd,lParam):
    className = (c_wchar * 7)()
    windll.user32.GetClassNameW(hwnd,className,7)
    className = className.value
    if className!="":
        print className,hwnd
        global editHwnd
        if className=='Edit':
            editHwnd = hwnd
    return 1
     
windll.user32.EnumChildWindows(hwnd,print_title,1)

print "editHwnd:",editHwnd

kListCount = windll.user32.GetKeyboardLayoutList(0,None)
print "GetKeyboardLayoutList:",kListCount

#kList= windll.Kernel32.HeapAlloc(windll.Kernel32.GetProcessHeap(),0x00000008,kListCount*sizeof(HKL))
kList=(HKL * kListCount)()
windll.user32.GetKeyboardLayoutList(kListCount,kList)
#kList = (HKL * kListCount).from_address(kList)
for k in kList: 
    print "KeyboardLayout:",k,k&0x0000ffff,k>>16,hex(k)
    try:
        key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Control\Keyboard Layouts\%X'%k)
        print _winreg.QueryValueEx(key,'Layout Text')[0]
    except:
        print "No Find Layout Text of %s"%k
hkl=kList[0]
#windll.Kernel32.HeapFree(windll.Kernel32.GetProcessHeap(),0,kList)

p= c_int()
windll.user32.GetWindowThreadProcessId(hwnd,byref(p))
pid = p.value
print "GetWindowThreadProcessId:",pid

tid = windll.Kernel32.GetCurrentThreadId()
print "GetCurrentThreadId:",tid

windll.user32.AttachThreadInput(tid,pid,True)

print "editHwnd:",editHwnd
print "hkl:",hkl
#print "WM_INPUTLANGCHANGEREQUEST:", windll.user32.SendMessageA(editHwnd,0x0050,True,hkl)
print "WM_INPUTLANGCHANGEREQUEST:", windll.user32.SendMessageA(hwnd,0x0050,True,hkl)

windll.user32.AttachThreadInput(tid,pid,False)

print "GetLastError:", GetLastError() 
 
恒河沙数1
帖子: 295
注册时间: 2013-04-27 19:26
系统: ubuntu+win7
送出感谢: 21 次
接收感谢: 9 次

Re: 使用Python语言控制其他进程窗口的输入法

#2

帖子 恒河沙数1 » 2015-01-23 20:27

$ python immethod.py
Traceback (most recent call last):
File "immethod.py", line 3, in <module>
from ctypes.wintypes import BOOL, HWND, LPARAM, HKL
File "/usr/lib/python2.7/ctypes/wintypes.py", line 23, in <module>
class VARIANT_BOOL(_SimpleCData):
ValueError: _type_ 'v' not supported
头像
oneleaf
论坛管理员
帖子: 10306
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04
送出感谢: 7 次
接收感谢: 112 次

Re: 使用Python语言控制其他进程窗口的输入法

#3

帖子 oneleaf » 2015-01-23 21:26

需要到windows环境下运行,针对记事本的控制。
头像
月下叹逍遥
论坛版主
帖子: 33994
注册时间: 2010-10-07 14:23
系统: Archdows10
来自: 某系某星某洲某国某省某市
送出感谢: 8 次
接收感谢: 63 次
联系:

Re: 使用Python语言控制其他进程窗口的输入法

#4

帖子 月下叹逍遥 » 2015-01-23 23:46

2.7啊。。。现在已经更新到3.4了。。
心似浮云常自在,意如流水任东西。
此事背后一定有个天大的咪咪
广告:
1、走过路过,不要错过,dropbox网盘2.25G大放送
py大法好,退C保平安
java多妖孽,VB本异端
日诵一千遍,快活似神仙
头像
oneleaf
论坛管理员
帖子: 10306
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04
送出感谢: 7 次
接收感谢: 112 次

Re: 使用Python语言控制其他进程窗口的输入法

#5

帖子 oneleaf » 2015-01-24 0:02

习惯了。 :em01
回复

回到 “Python/Php/Perl”