1

Тема: Shell.Application - не видит окно

Здравствуйте.
Написано на AutoHotkey, но думаю смысл будет понятен на любом языке.
В коллекцию Shell.Application.Windows почему то не добавляется окно запущенное с помощью WScript.Shell. Почему так?


MsgBox % ComObjCreate("Shell.Application").Windows.Count
MsgBox % ComObjCreate("WScript.Shell").Exec("mshta javascript:") ; немного ждём для гарантии 
MsgBox % ComObjCreate("Shell.Application").Windows.Count

2

Re: Shell.Application - не видит окно

А какая разница, с помощью чего оно запущено? Shell.Application служит для обращения к окнам процессов explorer.exe и iexplore.exe.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: Shell.Application - не видит окно

http://forum.script-coding.com/viewtopic.php?id=4196
А тут как находит?

4

Re: Shell.Application - не видит окно

Не спец по JScript и точно не знаю, что там происходит, но окно, созданное тем скриптом, у меня не перечисляется через Shell.Application.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: Shell.Application - не видит окно

Оно у кого работает, у кого нет. JScript тут не причём. По идее, и смутным воспоминаниям из MSDN, WScript.Shell добавляет процесс в коллекцию Shell, и если его окно является webbrouser, то оно должно быть в Shell.Application.

6

Re: Shell.Application - не видит окно

fkhlamingo пишет:

Оно у кого работает, у кого нет.

Что именно?

fkhlamingo пишет:

WScript.Shell добавляет процесс в коллекцию Shell

Тоже не очень понял, что вы имеете в виду.

fkhlamingo пишет:

если его окно является webbrouser, то оно должно быть в Shell.Application.

По этому поводу вот тут:

MSDN пишет:

The Shell windows collection includes file explorer windows and web browser windows Internet Explorer and 3rd-party web browsers.

Насколько я понял код, там возникает какое-то временное окно, которое и является частью коллекции Shell windows.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: Shell.Application - не видит окно

teadrinker пишет:

Что именно?

У кого то окно добавляется в Shell.Application сразу после запуска.

teadrinker пишет:

По этому поводу вот тут:

Спасибо!
Пробую Register, выдаёт несовпадение типов.


MsgBox % ComObjCreate("Shell.Application").Windows.Count

MsgBox % ComObjCreate("WScript.Shell").Exec("mshta javascript:")
Clipboard := хэндл окна
MsgBox % ComObjCreate("Shell.Application").Windows.Register(Clipboard, 1)
ComObjCreate("Shell.Application").Windows

8

Re: Shell.Application - не видит окно

Ну, если JSmаn тут появится, может разъяснит ситуацию.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: Shell.Application - не видит окно

fkhlamingo, обратите внимание на сообщение 2010-12-11 12:47:47 в упомянутой вами теме:

Xameleon пишет:

Дополню немного. Объект WebBrowser регистрируется в глобальной коллекции ShellWindows при установке его свойства RegisterAsBrowser в True. Благодаря этому можно из внешнего приложения его найти.

10 (изменено: Xameleon, 2021-09-22 22:00:03)

Re: Shell.Application - не видит окно

Доброго вечера, коллеги.

Мальчик-гей, по поводу метода Register: описание.

HRESULT Register(
  IDispatch *pid,
  long      hwnd,
  int       swClass,
  long      *plCookie
);

pid

Type: IDispatch*

The window's IDispatch interface.

hwnd

Type: long

A handle that specifies the window to register.

swClass

Type: int

A member of ShellWindowTypeConstants that specifies the type of window.

plCookie

Type: long*

The window's cookie.

В pid передаётся не хэндл, а ссылка на IDispatch интерфейс. В нашем случае ссылка на созданный ShellWindow или WebBrowser. Далее идёт hWnd окна,  потом класс окна и наружу в параметр plCookie возвращается уникальный идентификатор окна.

P.S Не уверен, что есть необходимость в использовании этого метода, но всё возможно.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

11

Re: Shell.Application - не видит окно

Xameleon пишет:

P.S Не уверен, что есть необходимость в использовании этого метода, но всё возможно.

То есть я всё правильно понимаю - в коде из 1 поста окно должно добавляться?
И как метод Register применить в JScript, я не нашёл примеров.

12

Re: Shell.Application - не видит окно

Мальчик-гей пишет:

RegisterAsBrowser в True

Запускал, не помогло.

13 (изменено: Xameleon, 2021-09-23 23:24:46)

Re: Shell.Application - не видит окно

fkhlamingo,
1)

То есть я всё правильно понимаю - в коде из 1 поста окно должно добавляться?

Если речь про ваше первое сообщение, то - нет.

2) покажите, пожалуйста, код где выполняете:

RegisterAsBrowser в True

3)

И как метод Register применить в JScript, я не нашёл примеров.

Из JScript с ним работать проблематично, так как получить plCookie по ссылке нативными средствами языка нет возможности.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

14

Re: Shell.Application - не видит окно

Xameleon пишет:

2) покажите, пожалуйста, код где выполняете:

Один в один что по ссылке в 3 посте. Все варианты пробовал из той темы. У кого всё норм с первого раза, у кого как и у меня, ничего с разными вариациями.
Разные ОС и битности в выборке юзеров и.т.д. Я нуб, остальные ещё глубже в танке. Глубина в танке не влияет на результат, или работает сразу, или никак.

15

Re: Shell.Application - не видит окно

fkhlamingo, по ссылке в 3-ем посте находятся примеры кода на JScript и VBScript. Вы в своём первом сообщении привели строки на AHK. Давайте всё же определимся на каком языке вы собираетесь писать код.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

16

Re: Shell.Application - не видит окно

Да, извините путаница вышла, мне надо написать на JScript, запускал на JScript по ссылке в 3-ем посте, потом пробовал на AHK (он для меня привычнее) так в тему и выложил.

17

Re: Shell.Application - не видит окно

fkhlamingo, теперь второй вопрос. Вы хотите создать окно или передавать данные между процессами ? Поясню свой вопрос - и для первого и для второго используется технология связывания двух процессов через Shell.Application. Я пока из заголовка вашей темы не понял какая конечная цель.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

18

Re: Shell.Application - не видит окно

Xameleon пишет:

Вы хотите передавать данные между процессами ?

Совершенно верно!

19

Re: Shell.Application - не видит окно

fkhlamingo, тогда я бы посоветовал ещё и https://github.com/diqipib/WSH-Worker-streams
Там передача делается через NTFS стримы.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

20

Re: Shell.Application - не видит окно

    (new ActiveXObject("WScript.Shell")).Run("mshta.exe javascript:"+CodeForLinking);
    while (NumberOfWindows==ShellWindows.Count) {WScript.Sleep(10);}

    for (var i=ShellWindows.Count; --i>=0;)
    try
    {
       if  (ShellWindows.Item(i).id == ID) 
       window = ShellWindows.Item(i).parent.parentWindow;
    } catch (e) {}

А есть более надёжный метод?
Надо создать окно проводника, но в цикле проверять что количество окон изменилось как то не правильно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui