2016-02-04 2 views
5

Я даже не знаю, с чего начать с моего вопроса, я пробовал сотню вещей и искал в Интернете часами, но не нашел ничего полезный. (Я открыт для каждого подвоха.)Активация (вывод на передний план) определенного окна с vbscript

Вот моя проблема:

У меня есть .hta-файл с ListBox, который выглядит следующим образом:

hta file

В нем перечислены все сессий/модификаций моего SAP Gui.

 Set SapGuiAuto = GetObject("SAPGUI") 
     Set application = SapGuiAuto.GetScriptingEngine 

     If application.Connections.Count > 0 Then 
      Set connection = application.Children(0) 

      If connection.Sessions.Count > 0 Then 
       Set session = connection.Children(0) 
      End If 
     End If 


     If IsObject(WScript) Then 
      WScript.ConnectObject session,  "on" 
      WScript.ConnectObject application, "on" 
     End If 

Set optGroup = Document.createElement("OPTGROUP") 
    optGroup.label = "Server" 


    'count all connected servers 
    ConnectionCount = application.Connections.Count 




     If ConnectionCount > 0 Then 
      Sessionlist.appendChild(optGroup) 

      Else 
      optGroup.label = "No connection here." 


     End If 
     'count all sessions per server 


     If ConnectionCount > 0 Then 
      For Each conn in application.Connections 

       'Text output connections and sessions 

       SessionCount = conn.Sessions.Count 
       whatIsIt = conn.Description 
       ConnectionFeld.innerhtml = ConnectionFeld.innerhtml & " <br> " & SessionCount & " Sessions auf " & whatIsIt 

       'fill listbox with all connections 

       Set objOption = nothing 
       Set optGroup = Document.createElement("OPTGROUP") 
       optGroup.label = conn.Description 
       Sessionlist.appendChild(optGroup) 

       i = 0 

        'fill listbox with all sessions 
        For Each sess In conn.Sessions 

         i = i + 1 
         Set objOption = Document.createElement("OPTION") 

          objOption.Text = "Session " & i & ": " & sess.ID 
          objOption.Value = sess.ID 
          SessionList.options.add(objOption) 

        Next 
      Next 

     Else 

     Exit Sub 

     End If 

Моя цель: Когда я двойной щелчок мышью по одной из записей в этом списке, выбранный экземпляр моей SAP GUI должен прийти на первый план/активизироваться.

К сожалению, мой диспетчер задач отображает только одну задачу, а это «SAP Logon». Одно из моих открытых окон также имеет имя «SAP Logon», все остальные имеют одно и то же имя: «SAP Easy Access».

enter image description here

Единственный способ можно увидеть идентификаторы соединения (Имя_сервера) и идентификаторы сеанса осуществляется посредством извлечения их с VBScript. (см. выше)

Есть ли способ сделать это? Только обходные я мог думать после попытки тысячи решений являются эти два:

чрезвычайно уродливые обходной путь:

If sessionID = sess.ID Then 

Set objShell = CreateObject("shell.application") 
objShell.MinimizeAll 

sess.findById("wnd[0]").maximize 

End If 

Это сводит к минимуму все окна затем максимизирует выбранное окно SAP. К сожалению, мой HTA-GUI также сведен к минимуму, что своего рода отстой.

Вторая идея:

Какие-то образом добраться до этих интерактивных рюшечек по ярлыку и положить, что в моем сценарии или каким-либо другой уродливо.

Под рукой вы должны сделать это:

Нажмите на эту маленькую стрелку, правый клик на иконку и затем LeftClick по имени.

info tray symbols

Есть ли способ автоматизировать этот процесс? Это сводит меня с ума.

Надеюсь, кто-то может мне помочь, это было бы НАСТОЯТЕЛЬНО оценено.

PS: Я сижу на машине с ограниченными правами, и поэтому я не могу справиться с этим с помощью решений Windows API-ish.

EDIT относительно комментариев:

Это не представляется возможным:

  • изменить записи реестра
  • создать COM-объекты
  • работу с чем-нибудь еще, кроме VBScript
+0

В чем именно причина, почему этот вопрос был приостановлен? O.o –

+0

Возможно, потому что вы еще не приняли [их ответ] (http://stackoverflow.com/a/35206506/692942), лично я не вижу ничего плохого в этом вопросе. Я видел гораздо хуже. – Lankymart

+0

Зачем мне это принимать ... Что бы ни случилось. Если вы видели гораздо хуже, вы, вероятно, видели гораздо лучше. ;) Что я могу изменить, чтобы сделать его более понятным? –

ответ

1

Я нашел его ...

resizeWorkingPane метод - для изменения размера окна - также работает на окнах в фоновом режиме. Если вы измените параметры, окно выйдет на передний план.

session.findById("wnd[0]").resizeWorkingPane 300,200,false 

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

1

От Помощь ,

Активирует окно приложения.

object.AppActivate title 

объект WshShell объект.

title Задает, какое приложение необходимо активировать. Это может быть строка, содержащая заголовок приложения (как указано в строке заголовка) или идентификатор процесса приложения.

Я не знаю, какой доступ к информации у вас есть о окне. Некоторые объекты COM имеют свойство HWnd. В этом сообщении вы узнаете, как преобразовать hwnd в ProcessID, который будет использоваться выше.

How to find the window Title of Active(foreground) window using Window Script Host

Yhis показывает, как преобразовать командную строку процесса, чтобы в ProcessId. Чтобы узнать, какие свойства и методы доступны Используйте инструмент командной строки, WMIC (wmic process get /? и wmic process call /?)

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 

Set colItems = objWMIService.ExecQuery("Select * From Win32_Process") 

For Each objItem in colItems 
    msgbox objItem.ProcessID & " " & objItem.CommandLine 
Next 
+0

К сожалению, я все еще получаю только один процесс со следующими параметрами: «ProcessID: 3208 // Имя: saplogon.exe // CommandLine:« C: \ Program Files (x86) \ SAP \ FrontEnd \ SAPgui \ saplogon.exe «Так что еще нет способа найти правильное окно для« AppActivate ».:/ –

+0

Объект процесса имеет sessionid. –

+1

Возможно, я не понимаю, но если есть только один процесс (и это то, что я получаю до сих пор с вашим кодом), я получаю только один SessionID (который равен «1»). –

1

Кроме того, он также работает со следующими командами:

session.findById("wnd[0]").iconify 
session.findById("wnd[0]").maximize 
+0

Я тестировал это снова сегодня, работает большую часть времени. Спасибо! Не знаю, почему он не работает время от времени. –

0

Это 100% от времени раствора. Это уродливо, но оно работает. Вы можете поменять код IQS3 t на любой другой, который вы можете подтвердить, что пользователь не будет и будет иметь доступ. Также часть моих рассуждений для выбора этого кода - это быстро загружается.

Set objShell = CreateObject("wscript.shell") 
session.findById("wnd[0]/tbar[0]/okcd").text = "/nIQS3" 
session.findById("wnd[0]").sendVKey 0 
objShell.AppActivate(cstr(session.ActiveWindow.Text)) 
session.findById("wnd[0]/tbar[0]/btn[3]").press 
+0

Попробуем это в ближайшее время. Спасибо за некропольное.;) –