Уведомления

Группа в Telegram: @pythonsu

#1 Март 13, 2009 14:33:31

Mottle
От:
Зарегистрирован: 2009-03-13
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск нового процесса, но не просто так

Доброе время суток!

Задача следующая:
1. Вызваем внешнее приложение.
2. Посылаем ему сообщение, что нажаты определенные клавиши.

Со второй задачей, к сожалению, через win32gui.SendMessage(…) не справился. Использую SendKeys. Если кто подскажет как сообщить приложению, что нажаты, скажем ALT+R, буду весьма признателен.
Основной вопрос в следующем. Вот мой код

import os
import SendKeys
import win32gui

arg=['']
wdir='C:\\Test\\'
Appl_path='C:\\Program1\\first.exe'

os.chdir(wdir)
os.spawnv(os.P_NOWAIT,Appl_path,arg)
#os.system(Appl_path)
#os.execv(Appl_path,arg)
#os.startfile(Appl_path)

hwnd=win32gui.FindWindow(aaa,bbb)
win32gui.SetForegroundWindow(hwnd)

SendKeys.SendKeys("""
%{r}{ENTER}
""")
При запуске приложения любым из указанных методов Python выдает
Traceback (most recent call last):
File “C:\Project\test.py”, line …, in <module>
win32gui.SetForegroundWindow(hwnd)
NameError: name ‘hwnd’ is not defined

Причем если приложение запустить самому до этого, то все отлично работает. Т.е. параметры aaa и bbb я указываю правильные



Отредактировано (Март 13, 2009 14:35:36)

Офлайн

#2 Март 13, 2009 14:37:39

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Запуск нового процесса, но не просто так

Ну все правильно… Если приложение не запущено, то нет и хэндлера его окна…



Офлайн

#3 Март 13, 2009 15:05:21

Mottle
От:
Зарегистрирован: 2009-03-13
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск нового процесса, но не просто так

Так приложение я командой os.spawnv(…) запускаю



Отредактировано (Март 13, 2009 15:05:40)

Офлайн

#4 Март 13, 2009 15:35:27

andreytata
От:
Зарегистрирован: 2009-03-03
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск нового процесса, но не просто так

Приложение ещё не стартануло - надо дождаться его старта - типа:

...
import time
while 1:
hwnd=win32gui.FindWindow(aaa,bbb)
win32gui.SetForegroundWindow(hwnd)
break
except NameError:
time.wait(0.1)
...
:)



Офлайн

#5 Март 13, 2009 17:25:18

Mottle
От:
Зарегистрирован: 2009-03-13
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск нового процесса, но не просто так

Спасибо, вот так все работает.

import os
import SendKeys
import win32gui

arg=['']
wdir='C:\\Test\\'
Appl_path='C:\\Program1\\first.exe'

os.chdir(wdir)
os.spawnv(os.P_NOWAIT,Appl_path,arg)


while 1:
try:
hwnd=win32gui.FindWindow(aaa,bbb)
win32gui.SetForegroundWindow(hwnd)
SendKeys.SendKeys("""
%{r}{ENTER}
""")
break
except win32gui.error:
time.sleep(0.1)
А не подскажете тогда, как оформить SendMessage() к этому окну, чтобы передать нажатие ALT+R?



Офлайн

#6 Март 13, 2009 20:45:09

andreytata
От:
Зарегистрирован: 2009-03-03
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск нового процесса, но не просто так

Mottle
А не подскажете тогда, как оформить SendMessage() к этому окну, чтобы передать нажатие ALT+R?
Не ведомо мне - я с похожими проблемками разбирался исключительно из С++ под QT а не Windows, кроме того в одном из окон приложения читал событя из сокета а в другом посылал в сокет не особо разбираясь в путаных API. :) Легче потом разделять приложение на одно окно на одной тачке - другое окно на соседней тачке - а приложение суть одно.

ЗЫ: Кроссплатформенность путь к свободе, а виндуз маздай :)



Офлайн

#7 Март 13, 2009 20:59:51

Mottle
От:
Зарегистрирован: 2009-03-13
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск нового процесса, но не просто так

Маздай оно конечно хорошо бы, но работать как-то надо )))
С задачей справился с помощью пакета pywinauto.
По-моему, очень изящно вышло:

import os
from pywinauto import application

wdir='C:\\Test\\'
Appl_path='C:\\Program1\\first.exe'
os.chdir(wdir)
app = application.Application()
app.Start_(Appl_path)
app.Appl.DrawOutline()
app.Appl.MenuSelect("Read")
app.Appl.MenuSelect("Quit")
Всем спасибо.



Отредактировано (Март 13, 2009 21:00:43)

Офлайн

#8 Март 13, 2009 21:36:30

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Запуск нового процесса, но не просто так

Так же советую посмотреть на pywinauto я немного разобрался(не без помощи форума)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version