• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Есть Ли Возможность Запустить Агент По Ярлыку?

  • Автор темы Serduko
  • Дата начала
S

Serduko

вывел список всех окон, там есть "Google - Microsoft Internet Explorer"
1047882.gif
 
N

nvyush

Вы бы уточнили задачу. А то похоже из пушки по воробьям...
 
H

hosm

мб, внимательней: FindWindow(0,"Google - Windows Internet Explorer")
 
L

lazybiz

А может стоит по классу поискать!? Мой Internet Explorer (и 32-битный и 64-х) имеет класс "IEFrame" в Windows 7.
FindWindow( "IEFrame", NULL ) или что у вас там заместо NULL ...
 
S

Serduko

Запускаю из 1Ски отчет CompanyMedia выводящийся в браузер, отчет запускается только в интерактиве(дизайн скрыт), необходимо, что бы браузер был перед глазами.
Спасибо OKEN, переклинило меня :newconfus: ЗАРАБОТАЛО!

Добавлено:
А может стоит по классу поискать!? Мой Internet Explorer (и 32-битный и 64-х) имеет класс "IEFrame" в Windows 7.
FindWindow( "IEFrame", NULL ) или что у вас там заместо NULL ...
Проблема в том, что может быть и не эксплорер...

Еще раз, благодарю всех :)
 
S

Serduko

возьму весь список, потом найду по Like "Google*"
 
L

lazybiz

Отличная идея. Потом расскажи что получилось!
 
S

Serduko

Блин, снова проблема, не могу заставить работать GetClassName, делаю следующим образом:

Код:
Declare Private Function GetClassName Lib "user32" Alias "GetClassNameA"(ByVal hwnd As long, ByVal lpClassName As string, ByVal nMaxCount As Long) As Long
Declare Private Function GetActiveWindow Lib "user32" () As Long

Dim buffer As String
Call GetClassName(GetActiveWindow, buffer, 100)
Print buffer

buffer пустой, если саму функу вывести дает "7". Может как то по другому объявлять buffer?
 
S

Serduko

вопрос решен:

Код:
Declare Private Function GetClassName Lib "user32" Alias "GetClassNameA"(ByVal hwnd As long, ByVal lpClassName As string, ByVal nMaxCount As Long) As Long
Declare Private Function GetActiveWindow Lib "user32" () As Long

Dim buffer As String
buffer= Space(100)
Call GetClassName(GetActiveWindow, buffer, 100)
Print buffer
 
S

Serduko

В общем получилось так:

Код:
Option Public
Option Declare

Declare Private Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long 
Declare Private Function GetWindowText Lib "user32" Alias "GetWindowTextA"(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long 
Declare Private Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Declare Private Function GetActiveWindow Lib "user32" () As Long
Declare Private Function FindWindowA Lib "user32" (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long
Declare Private Function ShowWindow Lib "user32" Alias "ShowWindow"(ByVal lhwnd As Long, ByVal nCmdShow As Long) As Long
Declare Private Function GetClassName Lib "user32" Alias "GetClassNameA"(ByVal hwnd As long, ByVal lpClassName As string, ByVal nMaxCount As Long) As Long
Sub Initialize
Call ShowReportWindow
End Sub
Sub ShowReportWindow
Const GW_HWNDFIRST = 0 
Const GW_HWNDNEXT = 2 
Dim CurrWnd As Long
Dim Length As Integer
Dim ListItem As String
Dim WinClass As String

'Получаем hWnd, который будет первым в списке 
'через него, мы сможем отыскать другие задачи
CurrWnd = GetWindow(GetActiveWindow(), GW_HWNDFIRST) 
'Пока возвращаемый hWnd имеет смысл, выполняем цикл
Do While CurrWnd <> 0 
'Получаем длину имени задания по CurrW nd
Length = GetWindowTextLength(CurrWnd) 
'Получить имя задачи из списка 
ListItem = Space(Length + 1) 
Length = GetWindowText(CurrWnd, ListItem, Length + 1) 
'Если получили имя задачи, значит добавляем ее в список найденных 
If Length > 0 And ListItem Like "Перечень неисполненных поручений на контроле*" Then
WinClass = Space(100)
Call GetClassName(FindWindowA(0 ,ListItem), WinClass, 100)
Call ShowWindow(FindWindowA(WinClass,0), 3)
End If 
'Переходим к следующей задаче из списка 
CurrWnd = GetWindow(CurrWnd, GW_HWNDNEXT) 
DoEvents
Loop
End Sub

Поскольку IE имеет несколько окон в одном процессе, то вначале ищу имя класса, а только потом по классу максимизирую окно. Вывод списка хэндлов взят отсюда:
 
L

lazybiz

Это из стиля: "Мы не ищем лёгких путей!"

А вообще кто-то сказал что "Суп. Надо. Есть. Ложкой!". Это как раз к этой теме можно отнести.
Я бы с удовольствием помог, но никак не могу понять что именно хочет сделать автор.
 
S

Serduko

Вообще то последний вариант рабочий, по просьбе lazybiz выложен. Что собственно не нравиться? WinAPI заморачиваюсь с прошлой недели, выложите код оптимальней, приму любую критику :rolleyes:...
 
L

lazybiz

Скажи конкретно, какое окно необходимо найти? Если одно из IE, то какой версии IE? Что в заголовке окна? По какому признаку? Или нужно найти активное окно? Опиши детально.

Зачем делать цикл? Do While CurrWnd <> 0
Зачем искать окно по имени, потом брать у него имя класса, потом поэтому классу искать окно?
Если заменить конструкцию:
Call GetClassName(FindWindowA(0 ,ListItem), WinClass, 100)
Call ShowWindow(FindWindowA(WinClass,0), 3)

на:
ShowWindow( FindWindowA(0 ,ListItem), 3 )

Эффект будет не тот же?
 
N

nvyush

А вообще кто-то сказал что "Суп. Надо. Есть. Ложкой!". Это как раз к этой теме можно отнести.
Я бы с удовольствием помог, но никак не могу понять что именно хочет сделать автор.
Согласен, что суп лучше есть ложкой, но иногда заказчик хочет есть суп консервным ножом. И переубедить его не представляется возможным.
А что касается "что именно хочет сделать автор", link removed
Запускаю из 1Ски отчет CompanyMedia выводящийся в браузер, отчет запускается только в интерактиве(дизайн скрыт), необходимо, что бы браузер был перед глазами.
 
S

Serduko

GetClassName возможно действительно не так нужен...

Вопрос лотусистам, вся эта байда запускается на Queryclose документа. Так вот, похоже после этой процедуры, Лотус возвращает окно клиента. Есть способ обойти это?


З.Ы. по поводу:
Если заменить конструкцию:
Call GetClassName(FindWindowA(0 ,ListItem), WinClass, 100)
Call ShowWindow(FindWindowA(WinClass,0), 3)

на:
ShowWindow( FindWindowA(0 ,ListItem), 3 )

Эффект будет не тот же?
В процессе решения проблемы, была такая мысль:
 
N

nvyush

Вопрос лотусистам, вся эта байда запускается на Queryclose документа. Так вот, похоже после этой процедуры, Лотус возвращает окно клиента. Есть способ обойти это?
Объясните подробнее задачу, что в каком порядке должно открываться/закрываться.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!