Тема: HTA,JS: Поверх всех окон
А как сделать своё окно поверх всех?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
А как сделать своё окно поверх всех?
Потребуетcя вызов API функции SetWindowPos с параметром HWND_TOPMOST.
http://msdn.microsoft.com/en-us/library … s.85).aspx
SetWindowPos Function
Changes the size, position, and Z order of a child, pop-up, or top-level window. These windows are ordered according to their appearance on the screen. The topmost window receives the highest rank and is the first window in the Z order.
HWND_TOPMOST
(HWND)-1
Places the window above all non-topmost windows. The window maintains its topmost position even when it is deactivated.
Угу... а как её вызвать внутри HTA'шки ?
Ещё вопросец... можно как-нить с панели задачь убрать/скрыть выполняемое задание. Поясню...
я сделал HTA форму (её видно - так и надо), убрал с неё все значки (свернуть/развернуть/закрыть) но задача осталась на панели задачь Можно ли её как-то убрать ?
Смысл не в том, чтобы сделать окно HTA незакрываемым, а в том, чтобы скрыть эту задачу с панели задачь...
P.S.:не для создания вируса или баннера вымогателя !!!
2 Евген:
На счёт отображения в таскбаре - Есть инфа по следующей ссылке. Читаем про showInTaskbar
http://ru.wikipedia.org/wiki/HTML_Application
А про вызов API функций - Я как раз недавно изучал этот вопрос. Есть вариант вызвать API в HTA,JS,VBS и т.п, но он мне категорически не нравится.
VBA: Обход ограничений на запуск макросов
Set VBACodeModule = New clsVBACodeModule
VBACodeModule.AddCode "Public Declare Function Beep Lib ""kernel32"" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long" & vbCrlf & _
"Sub MakeBeeeep()" & vbCrlf & _
" Beep 300, 400" & vbCrlf & _
" Beep 200, 400" & vbCrlf & _
" Beep 400, 400" & vbCrlf & _
"End Sub"
MsgBox "Сейчас будет произведён вызов API функции ""Beep""",vbInformation
VBACodeModule.Execute "MakeBeeeep"
Class clsVBACodeModule
Private WshShell, WordApplication, WordDocument, CodeModule, DontTrustInstalledFiles, Level, SettingsPath
Private Sub Class_Initialize()
SettingsPath = "HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Word\Security\"
Set WshShell = CreateObject("WScript.Shell")
On Error Resume Next
Level = WshShell.RegRead(SettingsPath & "Level")
DontTrustInstalledFiles = WshShell.RegRead(SettingsPath & "DontTrustInstalledFiles")
On Error Goto 0
WshShell.RegWrite SettingsPath & "Level",1,"REG_DWORD"
WshShell.RegWrite SettingsPath & "DontTrustInstalledFiles",0,"REG_DWORD"
Set WordApplication = CreateObject("Word.Application")
Set WordDocument = WordApplication.Documents.Add
WordDocument.UserControl = True
WordApplication.Visible = False
WordApplication.DisplayAlerts = 0
Set CodeModule = WordDocument.VBProject.VBComponents.Add(1).CodeModule 'WordDocument.VBProject.VBComponents.Add(1).CodeModule
End Sub
Sub AddCode(Code)
CodeModule.AddFromString(Code)
End Sub
Sub Execute(ProcName)
WordApplication.Run procname
End Sub
Private Sub Class_Terminate()
On Error Resume Next
if IsEmpty(Level) Then
WshShell.RegDelete SettingsPath & "Level"
Else
WshShell.RegWrite SettingsPath & "Level",Level,"REG_DWORD"
End if
if IsEmpty(DontTrustInstalledFiles) Then
WshShell.RegDelete SettingsPath & "DontTrustInstalledFiles"
Else
WshShell.RegWrite SettingsPath & "DontTrustInstalledFiles",DontTrustInstalledFiles,"REG_DWORD"
End if
WordApplication.Quit false
End Sub
End Class
Либо делаем свой OCX.
2 Евген:
На счёт отображения в таскбаре - Учим мат. часть по следующей ссылке. Читаем про showInTaskbar
http://ru.wikipedia.org/wiki/HTML_Application
Блин...
во я стремак... не догодался пошарить на вики...
трижды сорри коллеги... виноват по пояс...
А как сделать своё окно поверх всех?
Я бы просто засунул в цикл WinActivate
Dim WshShell
Set WshShell = WScript.CreateObject("Wscript.Shell")
While True
WshShell.AppActivate "Notepad"
WScript.Sleep 50
Wend
Кто знает, в какой библиотеке находится АРI-функция SetWindowPosA?
Я узнал, что можно сделать так:
var WSH=new ActiveXObject("WScript.Shell");
WSH.Run("RunDll32 <библиотека>, <функция> <аргументы>");
Кто знает, в какой библиотеке находится АРI-функция SetWindowPosA?
Правильное имя функции SetWindowPos. Рабочий пример ниже (XP SP3, IE8)
<HTML>
<BODY>
<script language="vbscript">
Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_NOACTIVATE = &H10
Const SWP_SHOWWINDOW = &H40
Dim objDWX
Set objDWX = CreateObject("DynamicWrapperX")
objDWX.Register "user32.dll", "SetWindowPos", "i=lllllll", "r=l"
objDWX.Register "user32.dll", "GetActiveWindow", "r=l"
objDWX.SetWindowPos objDWX.GetActiveWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
</script>
</BODY>
</HTML>
А если надо без сторонних библиотек? Там нужна HWND. Её можно получить через MSScriptControl.
Кто знает, в какой библиотеке находится АРI-функция SetWindowPosA?
Я узнал, что можно сделать так:var WSH=new ActiveXObject("WScript.Shell"); WSH.Run("RunDll32 <библиотека>, <функция> <аргументы>");
Вот этот метод был бы лучше всего, т.к. не использует сторонних компонентов и 100 пудово отработал бы на каждом компе...
Может быть как-то так?
<html>
<script>
var WSH=new ActiveXObject("WScript.Shell");
</script>
<body>
<object id="ScriptControl" classid="clsid:0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC"><PARAM name=AllowUi value=1></object>
<script>
function SetTop()
{
WSH.Run("rundll32 USER32.DLL, SetWindowPos "+ScriptControl.SiteHwnd+", -1,0,0,0,0,16");
}
setInterval(SetTop, 100);
//SetTop();
</script>
</body>
</html>
Решение оказалось неверным. ScriptControl.SiteHwnd не возвращает хэндл окна HTA.
Вот сейчас весь вопрос...
как узнать хэндл стандартными средствами, чтобы решение было универсальным... (для всех)
А может быть так же с помощью RUNDLL32 можно погонять какую-нить функцию по перечислению хэндлов и найти из всех свой ?
http://msdn.microsoft.com/en-us/library … s.85).aspx
Не ?
ScriptControl.SiteHwnd не возвращает хэндл окна HTA.
Да, это свойство возвращает хэндл самого элемента управления.
как узнать хэндл стандартными средствами, чтобы решение было универсальным... (для всех)
Евген, мне, если честно, проще написать свою версию WScript и HTA на VB или Delphi. Слишком много костылей выдумывать не есть хорошо :-)
2 JSman согласен...
может быть как-нить в будущем данная ситуация будет решаться прощще, а пока что - вот так...
А может быть так же с помощью RUNDLL32 можно погонять какую-нить функцию по перечислению хэндлов и найти из всех свой ?
Можно использовать FindWindow Lib "user32", которая используется во всевозможных рапперах, отправить ей APPLICATIONNAME (из VB - без проблем), но вот как из нее получить хэндл из скрипта, чтобы засунуть его в аргумент SetWindowPos ?
И потом отработать:
WSH.Run("RunDll32.exe user32.dll, SetWindowPos <аргументы>")
Пытался получить хэндл через Win32_Process.Handle - выдает ProcessId
По ходу надо еще по Win32_Thread пробежать
<html>
<head>
<title>
</title>
</head>
<script>
Сообщить=function(x){alert(x)}
ТекстОкна=function(x,z){var y='';for(;y.length<=1024;y+=' ');z.GetWindowTextW(x,y,1024);return y.replace(/\x00.*/,'');}
КлассОкна=function(x,z){var y='';for(;y.length<=1024;y+=' ');z.GetClassNameW (x,y,1024);return y.replace(/\x00.*/,'');}
ПолучитьХендл=function(e)
{
var Враппер = new ActiveXObject("DynamicWrapper");
Враппер.Register("user32.dll", "FindWindowW", "i=ll", "f=s", "r=l");
Враппер.Register("user32.dll", "GetWindow", "i=ll", "f=s", "r=l");
Враппер.Register("user32.dll", "GetParent", "i=l", "f=s", "r=l");
Враппер.Register("kernel32.dll", "GetCurrentThreadId", "f=s", "r=l");
Враппер.Register("User32.dll", "GetWindowThreadProcessId", "i=ll", "f=s", "r=l");
Враппер.Register("User32.dll", "GetWindowTextW", "i=hwl", "f=s", "r=l");
Враппер.Register("User32.dll", "GetClassNameW", "i=hwl", "f=s", "r=l");
Хендл = Враппер.FindWindowW(0, 0);
var Массив=new Array();
while (Хендл != 0)
{
if (Враппер.GetParent(Хендл)==0)
{
Нить=Враппер.GetWindowThreadProcessId(Хендл, 0);
if (Нить==Враппер.GetCurrentThreadId())
{
Массив[Массив.length]={Хендл: Хендл, Класс: КлассОкна(Хендл,Враппер)};
}
//break;
}
Хендл = Враппер.GetWindow(Хендл, 2);
}
return Массив;
}
</script>
<body onload='javascript:Массив=ПолучитьХендл();for(x in Массив)alert(Массив[x].Класс + ": " + Массив[x].Хендл);'>
</body>
</html>
По ходу надо еще по Win32_Thread пробежать
dab00, можете не бегать: в Wbem нет средств для работы с окнами.
Тут нужен PoSH с его доступом к .Net, либо какой-либо посредник в виде библиотеки, например, тот же DynamicWrapper/DynamicWrapperX, AutoItX и т.п.
можете не бегать: в Wbem нет средств для работы с окнами.
Тут нужен PoSH с его доступом к .Net, либо какой-либо посредник в виде библиотеки, например, тот же DynamicWrapper/DynamicWrapperX, AutoItX и т.п.
К сожалению Вы правы. С потоками тоже не катит. Без либ не получится. А так интересно ... .
Предлагаю резюмировать: из VBS к API - проблематично, обратиться можно, получить ответ - не реально.
<html>
<head>
<title>
Приложение на самом верху...
</title>
</head>
<script>
var Заголовок=document.title;
document.title=""+Math.random()+" "+Math.random();
ТекстОкна=function(x,z){var y='';for(;y.length<=1024;y+=' ');z.GetWindowTextW(x,y,1024);return y.replace(/\x00.*/g,'');}
ПолучитьХендл=function(e)
{
var Враппер = new ActiveXObject("DynamicWrapper");
Враппер.Register("user32.dll", "FindWindowW", "i=ll", "f=s", "r=l");
Враппер.Register("user32.dll", "GetWindow", "i=ll", "f=s", "r=l");
Враппер.Register("user32.dll", "GetParent", "i=l", "f=s", "r=l");
Враппер.Register("User32.dll", "GetWindowTextW", "i=hwl", "f=s", "r=l");
var Хендл = Враппер.FindWindowW(0, 0);
while (Хендл != 0)
{
if (ТекстОкна(Хендл,Враппер)==document.title) break;
Хендл = Враппер.GetWindow(Хендл, 2);
}
document.title=Заголовок;
return Хендл;
}
НаСамыйПереднийПлан=function(x)
{
var Враппер = new ActiveXObject("DynamicWrapper");
Враппер.Register("user32.dll", "SetWindowPos", "i=hllllll", "f=s", "r=l");
Враппер.SetWindowPos(x, -1, 0, 0, 0, 0, 16 | 64 | 2 | 1)
}
window.onload=function(e){НаСамыйПереднийПлан(ПолучитьХендл())}
</script>
<body>
</body>
</html>
если задача просто на передний план есть старый финт, минимизировать все окна и вывести какой нибудь алерт
Спасибо smaharbA
Спасибо smaharbA
Честно заинтересовала тема типа WinLocker, на скриптах без рапперов не получилось Пока
раппер вполне может быть встроен в скрипт/хта и для регистрации не требует привелегий
раппер вполне может быть встроен в скрипт/хта и для регистрации не требует привелегий
хотелось бы нативно, без регистраций dll
OFF: dab00, Вы в какие дебри полезли? Какие такие тестовые баннеры?! На всякий случай, напоминаю заранее: §2.9.
OFF: dab00, Вы в какие дебри полезли? Какие такие тестовые баннеры?!
ОК, забыли про баннеры
если задача просто на передний план есть старый финт
Задача именно неубиваемо во весь экран , чтобы ни Alt+Tab, ни Alt+F4
Пока не получается достучаться до хэндла окна без посредников-рапперов, чтобы отправить его (хендл) в SetWindowPos, кто сумеет - тот молодец
А дальше можно прессовать возникающие процессы, типа:
Dim objWMI, colMonitoredProcesses, objLatestProcess
Set objWMI = GetObject("winmgmts:\\.\Root\CIMV2")
Set colMonitoredProcesses = objWMI.ExecNotificationQuery("SELECT * FROM __InstanceCreationEvent " _
& "WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'")
Do
Set objLatestProcess = colMonitoredProcesses.NextEvent
objLatestProcess.TargetInstance.Terminate()
Loop
Set objLatestProcess = Nothing
Set colMonitoredProcesses = Nothing
Весело же
Если Вы собрались запускать HTA то какая Вам разница тащить с собой динавраппер или нет
динавраппер вполне встраивается в тело хта и прекрасно выгружается и регистрируется в юзерспейсе
динавраппер вполне встраивается в тело хта и прекрасно выгружается и регистрируется в юзерспейсе
Честно - не знаю как он встраивается. Просветите, если не трудно.
Написал свой маленький раппер и получился вот такой шуточный локер. По-моему прикольно .
ИМХО не прикольно .
Обосную почему:
1) Потому что имеется готовый код и все исходники, для того чтобы сделать полноценный вымогатель (в данном случае не следовало всё выкладывать...)
2) использованы сторонние библиотеки...
ИМХО из поста надо вырезать ссылку на готовое решение... достаточно было в данном случае опубликовать только часть кода...
в данном случае не следовало всё выкладывать...
он же шуточный
использованы сторонние библиотеки...
моя это библиотека, сегодня скомпилировал
В коде есть участки как раз по теме.
Надеюсь правила не нарушил.
он же шуточный
Согласитесь, его совсем не долго переделать в готовое решение, которое можно будет подцепить на просторах инета...
Надеюсь правила не нарушил.
ИМХО ссылочку из 32 поста почикайте на готовое решение...
2 dab00 без обид...
просто так всем станет немного безопасней...
Вот так, как есть сейчас, вполне тоже можно собрать готовое решение...
ИМХО всё необходимое имеется...
Вот так, как есть сейчас, вполне тоже можно собрать готовое решение...
ИМХО всё необходимое имеется...
Ну тогда нужно и APIWrapper и прочие рапперы забанить.
Ок, уберу код либы.
Ок, уберу код либы.
Не-е-е-е... я с ним имел ввиду... пускай он-то остаётся...
Что еще? Вроде бы все убрал...
Даже больше чем надо было...
Даже больше чем надо было...
Пишу статью про разработку, со всеми исходниками, скоро выложу, если интересно - отправлю ссылки на мыло.
Мне отправьте по возможности .
Мне отправьте по возможности .
У меня в подписи ссылка - в разделе "статьи". Не пытайтесь повторить это дома
Могу сравнить этот код с бомбой, в том смысле, что без "средства доставки" он довольно безобиден для окружающих .
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться