Что нового

[Окна, Диалоги] Как открыть папку, вставить файл из буфера, закрыть окно?

shatto

Новичок
Сообщения
8
Репутация
0
Версия: 3
Хотелось решить задачку про копирование файлов в нужную директорию
В буфере находится файл.
Путь к изначальному файлу использовать нельзя. ( файл скопирован из локальной машины при подключении по RDP)
Известно в какую папку надо скопировать этот файл.
Нужно:
-Открыть папку
- Вставить файл
-Закрыть папку

Хочется решить простыми комбинациями Ctrl+v (Shift+Insert),и Alt+F4
Send не срабатывает, экспериментировал с ControlSend, тоже не получилось,
что можете посоветовать?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
shatto [?]
файл скопирован из локальной машины при подключении по RDP
Не пойму - откуда и куда вы копируете? С удалённой, к которой подключены по RDP, на локальную? Или наоборот?
И какая у вас Windows? На WindowsXP RDP не умеет копировать файлы через буфер обмена.
 
Автор
S

shatto

Новичок
Сообщения
8
Репутация
0
Файл скопирован на локальной машине. Версия ОС Win7.
Пытаюсь скопировать на сервер. ОС Windows2008
Проблему доступности копирования файлов на ХР вроде можно решить обновлением RDP-клиента.

В свойствах RDP подключения с сервером указана доступность буфера обмена и локальных дисков.
Простым кликанием правой кнопки мыши вставить файл из буфера я могу

можно эскпериментировать и без сервера. Просто хочется вставить файл из буфера используя горячие клавиши. Кажется все просто, но.. опыта наверное пока не хватает :smile:
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Windows2008 у меня нет - проверял на двух "семёрках".
В свойствах подключения установить "Использовать сочетания клавиш Windows" - "На удалённом компьютере". Если выбрано "Только в полноэкранном режиме", то окно подключения должно быть в этом режиме. Папка должна существовать на удалённой машине и файл уже находиться в буфере обмена на локальной машине.
Код:
$dir = "D:\Test" ; папка на удалённой машине
WinActivate("[class:TscShellContainerClass]")
WinWaitActive("[class:TscShellContainerClass]")
Send("#r")
Sleep(1000)
Send($dir & "{enter}")
Sleep(1000)
Send("+{ins}")
Sleep(3000)
Send("!{f4}")
 
Автор
S

shatto

Новичок
Сообщения
8
Репутация
0
Код:
WinActivate("[class:TscShellContainerClass]")
WinWaitActive("[class:TscShellContainerClass]")

а это для чего стесняюсь спросить :-[
Разве окошко уже и так не активно? Только что же открыли его
Тестирую пока. У меня интеграция AutoIt c 1c
тонкое место пока
Код:
Send("+{ins}")
.
Открывается и закрывается, но не вставляется:smile:
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
shatto [?]
Send эмулирует нажатие клавиш в активном окне. Поэтому окну RDP сначала отправляем команду активации, потом ждём его активации.
Попробуйте заменить на
Код:
Send("^v")



Добавлено:
Сообщение автоматически объединено:

shatto [?]
Открывается и закрывается, но не вставляется
Файл большой? Окно копирования успевает появиться? Увеличьте последнюю задержку секунд до десяти...


Добавлено:
Сообщение автоматически объединено:

shatto [?]
Разве окошко уже и так не активно? Только что же открыли его
В моём скрипте оно открыто, но не активно. Поэтому так.
Если вы в своём скрипте его открываете и оно активно, то активировать не нужно.
OffTopic:
Вы так часто редактируете посты, что я не успеваю за ними следить :smile:
 
Автор
S

shatto

Новичок
Сообщения
8
Репутация
0
У меня оно активно,но даже отправка с клавиатуры горячей клавиши вставки не дает результата
Нужно сначала щелкнуть по области
.. :smile: это похоже означает что оно не активно?
только почему-то 1ска подвисает с этими команадами WinActivate
а как можно эмулировать нажатие мышки по центру этого окошка (D:/test)?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Что-то вы меня запутали. При чём тут 1С?
У вас на удалённой машине работает 1С? И к этой машине вы подключаетесь по RDP? А скрипт вы где запускаете? На локальной машине или на удалённой?
 
Автор
S

shatto

Новичок
Сообщения
8
Репутация
0
У меня скрипт запускается через 1с, который стоит на удаленной машине.
Если б сразу написал про это, думаю, это отпугнуло бы сразу.
Но суть от этого не меняется:smile:
Из 1с скрипт прекрасно запускается, вот только еще чуть-чуть! с вставкой б разобраться

___________
Добавлено 17.01
Есть некая уверенность что все получится, если получится программно щелкнуть мышкой в область куда я хочу вставить файл
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
shatto [?]
скрипт запускается через 1с, который стоит на удаленной машине
Файл вы отправляете в буфер на локальной машине. Скрипт выполняется на удалённой машине. В какой момент происходит синхронизация буферов - я не знаю. Может они синхронизируются при активации окна подключения? Т.е. на момент выполнения скрипта в буфере удалённой машины, возможно, ничего и нет. Что вам мешает выполнять данный скрипт на локальной машине при активном сеансе RDP?
 
Автор
S

shatto

Новичок
Сообщения
8
Репутация
0
в буфере удалённой машины, возможно, ничего и нет
Тут все нормально. Буфер локальной машины доступен на удаленной.
Может они синхронизируются при активации окна подключения?
Здесь точно нет. Лучше копать в другую сторону.
Что вам мешает выполнять данный скрипт на локальной машине при активном сеансе RDP?
-это продиктовано условием общей задачи...

Я понял зачем нужно
Код:
WinActivate("[class:TscShellContainerClass]")
WinWaitActive("[class:TscShellContainerClass]")

-это когда копирование происходит из клиентской машины

Мне же нужно активное окно проводника с папкой, куда копируется файл
У меня открытие окна с папкой-приемником происходит другим образом
не так как у вас:
Код:
Send("#r")
Sleep(1000)
Send($dir & "{enter}")

вот из-за этого проблема

Окошко с папкой-приемником открыто, оно даже активно, но ctrl+v не дает ничего...
а вот если щелкнуть мышкой в области, где файлы, тогда все нормально вставляется

________________________________________
добавлено
Если проделывать руками все команды Win-R, ввод имени файла, Enter, ctrl+v, alt+F4,
тогда все отличненько получается
а когда скриптом не очень.
Вопрос:
этот код
Код:
Send($dir & "{enter}")

можно разделить на 2 Send'а?
или как-нибудь по-другому сделать
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
shatto [?]
щелкнуть мышкой в области, где файлы
Код:
ControlClick("[class:CabinetWClass]", "", "DirectUIHWND3")

передать фокус без клика
Код:
ControlFocus("[class:CabinetWClass]", "", "DirectUIHWND3")



Добавлено:
Сообщение автоматически объединено:

shatto [?]
тогда все отличненько получается
Вот именно это делает скрипт, но при условии, если он запущен на локальной машине. А скрипт, работающий на удалённой машине с окном, о котором он ничего не знает, да ещё запускаемый третьим приложением - это не то же самое. И проблема, обозначенная в описании темы, ничего общего не имеет с той, к которой мы пришли ;)


Добавлено:
Сообщение автоматически объединено:

shatto [?]
разделить на 2 Send'а
Код:
Send($dir)
Send("{enter}")

Можно даже задержку между ними поставить в миллисекундах
Код:
Sleep(1000) ; одна секунда
 
Автор
S

shatto

Новичок
Сообщения
8
Репутация
0
Насчет темы согласен. Как бы ее переименовать?
Кстати в случае с Send при русской раскладке клавиатуры путь к папке -приемнику не тот который нужен передается:smile:
Код:
ControlFocus("[class:CabinetWClass]", "", "DirectUIHWND3")

а в этом операторе параметры такие же передавать?
______________________
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
shatto [?]
Send при русской раскладке клавиатуры
Это известная проблема. Воспользуйтесь поиском по форуму.
параметры такие же передавать?
Запустите утилиту Au3Info.exe, перетащите "Finder Tool" на поле с файлами и отпустите. На вкладке Window найдёте Сlass, на вкладке Control - ClassnameNN. Вот эти данные и подставляйте первым и третьим параметром соответственно. Я брал с окна проводника Windows7.
 
Автор
S

shatto

Новичок
Сообщения
8
Репутация
0
Уррааааааааааааааааааааааа!!! Получилось!
InnI огромное вам спасибо!!!
:IL_AutoIt_1:

Теперь появился еще один вопрос:
Скрипт запускается программно из 1с, при закрытии папки-приемника файла окно 1с становится неактивным, фокус переходит в какое -нибудь другое окно
Вопрос: как сделать активным окно приложения 1с ( заголовок у него: "1с:Предприятие")?

Похоже вот так:
Код:
WinActivate("title")

где title- заголовок окна,
а можно в каком-нибудь операторе использовать название класса окна?
а третий параметр откуда брать ("DirectUIHWND3")? вижу, нашел :smile:


Добавлено:
Сообщение автоматически объединено:

... :shok:
недолго длилась радость
проблема: файлы копируются по разному по времени
и неясно как отследить "процесс копирования". Хорошо б, если как только он закончится, закрыть окно. Можно ли?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Код:
; ждём появления окна копирования 5 секунд
$winCopy = WinWait("Копирование", "", 5)
; если окно появилось, ждём его закрытия
If $winCopy <> 0 Then
  While WinExists($winCopy)
    Sleep(100)
  WEnd
EndIf
; после закрытия фокус будет передан в окно проводника, которое закрываем
Sleep(500)
Send("!{f4}")
; активируем окно 1с
WinActivate("1с:Предприятие")
 
Верх