1

Тема: HTA,JS: Поверх всех окон

А как сделать своё окно поверх всех?

2

Re: HTA,JS: Поверх всех окон

Потребует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.

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

3 (изменено: Евген, 2011-05-26 14:47:18)

Re: HTA,JS: Поверх всех окон

Угу...   а как её вызвать внутри HTA'шки ?
Ещё вопросец...   можно как-нить с панели задачь убрать/скрыть выполняемое задание. Поясню...
я сделал HTA форму (её видно - так и надо), убрал с неё все значки (свернуть/развернуть/закрыть) но задача осталась на панели задачь   Можно ли её как-то убрать ?
Смысл не в том, чтобы сделать окно HTA незакрываемым, а в том, чтобы скрыть эту задачу с панели задачь...   

P.S.:не для создания вируса или баннера вымогателя !!!

Времени не хватает... :-(

4

Re: HTA,JS: Поверх всех окон

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. И не выпендриваемся.

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

5

Re: HTA,JS: Поверх всех окон

Либо берём готовые:
Библиотека dynwrapx.dll и вызов функций Win 32 API
JScript/VBScript & Win32 API: DynamicWrapperX
JScript/VBScript & Win32: расширение возможностей DynamicWrapperX

6

Re: HTA,JS: Поверх всех окон

Xameleon пишет:

2 Евген:

На счёт отображения в таскбаре - Учим мат. часть по следующей ссылке. Читаем про showInTaskbar
http://ru.wikipedia.org/wiki/HTML_Application

Блин...
во я стремак...  не догодался пошарить на вики...
трижды сорри коллеги...   виноват по пояс...

Времени не хватает... :-(

7

Re: HTA,JS: Поверх всех окон

Ottiwell_Wood пишет:

А как сделать своё окно поверх всех?

Я бы просто засунул в цикл WinActivate

Dim WshShell
Set WshShell = WScript.CreateObject("Wscript.Shell")
While True
    WshShell.AppActivate "Notepad"
    WScript.Sleep 50
Wend

8 (изменено: Ottiwell_Wood, 2011-05-29 18:27:45)

Re: HTA,JS: Поверх всех окон

Кто знает, в какой библиотеке находится АРI-функция SetWindowPosA?
Я узнал, что можно сделать так:

var WSH=new ActiveXObject("WScript.Shell");
WSH.Run("RunDll32 <библиотека>, <функция> <аргументы>");

9 (изменено: VSVLAD, 2011-05-29 18:53:15)

Re: HTA,JS: Поверх всех окон

Ottiwell_Wood пишет:

Кто знает, в какой библиотеке находится АР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>

10

Re: HTA,JS: Поверх всех окон

А если надо без сторонних библиотек? Там нужна HWND. Её можно получить через MSScriptControl.

11

Re: HTA,JS: Поверх всех окон

Ottiwell_Wood пишет:

Кто знает, в какой библиотеке находится АРI-функция SetWindowPosA?
Я узнал, что можно сделать так:

var WSH=new ActiveXObject("WScript.Shell");
WSH.Run("RunDll32 <библиотека>, <функция> <аргументы>");

Вот этот метод был бы лучше всего, т.к. не использует сторонних компонентов и 100 пудово отработал бы на каждом компе...

Времени не хватает... :-(

12

Re: HTA,JS: Поверх всех окон

Может быть как-то так?

<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>

13

Re: HTA,JS: Поверх всех окон

Решение оказалось неверным. ScriptControl.SiteHwnd не возвращает хэндл окна HTA.

14 (изменено: Евген, 2011-08-15 08:02:21)

Re: HTA,JS: Поверх всех окон

Вот сейчас весь вопрос...
как узнать хэндл стандартными средствами, чтобы решение было универсальным...  (для всех)

А может быть так же с помощью RUNDLL32 можно погонять какую-нить функцию по перечислению хэндлов и найти из всех свой ?

http://msdn.microsoft.com/en-us/library … s.85).aspx
Не ?

Времени не хватает... :-(

15

Re: HTA,JS: Поверх всех окон

JSman пишет:

ScriptControl.SiteHwnd не возвращает хэндл окна HTA.

Да, это свойство возвращает хэндл самого элемента управления.

16

Re: HTA,JS: Поверх всех окон

как узнать хэндл стандартными средствами, чтобы решение было универсальным...  (для всех)

Евген, мне, если честно,  проще написать свою версию WScript и HTA на VB или Delphi. Слишком много костылей выдумывать не есть хорошо :-)

17

Re: HTA,JS: Поверх всех окон

2 JSman согласен...
может быть как-нить в будущем данная ситуация будет решаться прощще, а пока что - вот так...

Времени не хватает... :-(

18

Re: HTA,JS: Поверх всех окон

Евген пишет:

А может быть так же с помощью RUNDLL32 можно погонять какую-нить функцию по перечислению хэндлов и найти из всех свой ?

Можно использовать FindWindow Lib "user32", которая используется во всевозможных рапперах, отправить ей APPLICATIONNAME (из VB - без проблем), но вот как из нее получить хэндл из скрипта, чтобы засунуть его в аргумент SetWindowPos ?
И потом отработать:
WSH.Run("RunDll32.exe user32.dll, SetWindowPos <аргументы>")
Пытался получить хэндл через Win32_Process.Handle - выдает ProcessId

19

Re: HTA,JS: Поверх всех окон

По ходу надо еще по Win32_Thread пробежать

20 (изменено: smaharbA, 2011-08-22 18:22:23)

Re: HTA,JS: Поверх всех окон

<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>
Я конечно далек от мысли... (с)

21

Re: HTA,JS: Поверх всех окон

dab00 пишет:

По ходу надо еще по Win32_Thread пробежать

dab00, можете не бегать: в Wbem нет средств для работы с окнами.

Тут нужен PoSH с его доступом к .Net, либо какой-либо посредник в виде библиотеки, например, тот же DynamicWrapper/DynamicWrapperX, AutoItX и т.п.

22 (изменено: dab00, 2011-08-22 19:36:38)

Re: HTA,JS: Поверх всех окон

alexii пишет:

можете не бегать: в Wbem нет средств для работы с окнами.
Тут нужен PoSH с его доступом к .Net, либо какой-либо посредник в виде библиотеки, например, тот же DynamicWrapper/DynamicWrapperX, AutoItX и т.п.

К сожалению Вы правы. С потоками тоже не катит. Без либ не получится. А так интересно ... .
Предлагаю резюмировать: из VBS к API - проблематично, обратиться можно, получить ответ - не реально.

23

Re: HTA,JS: Поверх всех окон

<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>
Я конечно далек от мысли... (с)

24

Re: HTA,JS: Поверх всех окон

если задача просто на передний план есть старый финт, минимизировать все окна и вывести какой нибудь алерт

Я конечно далек от мысли... (с)

25

Re: HTA,JS: Поверх всех окон

Спасибо smaharbA

26 (изменено: dab00, 2011-08-23 09:46:58)

Re: HTA,JS: Поверх всех окон

dab00 пишет:

Спасибо smaharbA

Честно заинтересовала тема типа WinLocker, на скриптах без рапперов не получилось Пока

27

Re: HTA,JS: Поверх всех окон

раппер вполне может быть встроен в скрипт/хта и для регистрации не требует привелегий

Я конечно далек от мысли... (с)

28 (изменено: dab00, 2011-08-23 09:46:33)

Re: HTA,JS: Поверх всех окон

smaharbA пишет:

раппер вполне может быть встроен в скрипт/хта и для регистрации не требует привелегий

хотелось бы нативно, без регистраций dll

29

Re: HTA,JS: Поверх всех окон

OFF: dab00, Вы в какие дебри полезли? Какие такие тестовые баннеры?! На всякий случай, напоминаю заранее: §2.9.

30 (изменено: dab00, 2011-08-23 10:05:04)

Re: HTA,JS: Поверх всех окон

alexii пишет:

OFF: dab00, Вы в какие дебри полезли? Какие такие тестовые баннеры?!

ОК, забыли про баннеры

smaharbA пишет:

если задача просто на передний план есть старый финт

Задача именно неубиваемо во весь экран , чтобы ни 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

Весело же

31

Re: HTA,JS: Поверх всех окон

Если Вы собрались запускать HTA то какая Вам разница тащить с собой динавраппер или нет
динавраппер вполне встраивается в тело хта и прекрасно выгружается и регистрируется в юзерспейсе

Я конечно далек от мысли... (с)

32 (изменено: dab00, 2011-08-23 19:51:09)

Re: HTA,JS: Поверх всех окон

smaharbA пишет:

динавраппер вполне встраивается в тело хта и прекрасно выгружается и регистрируется в юзерспейсе

Честно - не знаю как он встраивается. Просветите, если не трудно.
Написал свой маленький раппер и получился вот такой шуточный локер. По-моему прикольно .

33

Re: HTA,JS: Поверх всех окон

ИМХО не прикольно .
Обосную почему:
1) Потому что имеется готовый код и все исходники, для того чтобы сделать полноценный вымогатель (в данном случае не следовало всё выкладывать...)
2) использованы сторонние библиотеки...

ИМХО из поста надо вырезать ссылку на готовое решение... достаточно было в данном случае опубликовать только часть кода...

Времени не хватает... :-(

34 (изменено: dab00, 2011-08-23 20:17:13)

Re: HTA,JS: Поверх всех окон

Евген пишет:

в данном случае не следовало всё выкладывать...

он же шуточный

Евген пишет:

использованы сторонние библиотеки...

моя это библиотека, сегодня скомпилировал

В коде есть участки как раз по теме.
Надеюсь правила не нарушил.

35 (изменено: Евген, 2011-08-23 19:49:28)

Re: HTA,JS: Поверх всех окон

dab00 пишет:

он же шуточный

Согласитесь, его совсем не долго переделать в готовое решение, которое можно будет подцепить на просторах инета...

dab00 пишет:

Надеюсь правила не нарушил.

ИМХО ссылочку из 32 поста почикайте на готовое решение...

Времени не хватает... :-(

36 (изменено: dab00, 2011-08-23 20:27:28)

Re: HTA,JS: Поверх всех окон

Евген пишет:

ИМХО ссылочку из 32 поста почикайте на готовое решение...

ОК

37

Re: HTA,JS: Поверх всех окон

2 dab00 без обид...
просто так всем станет немного безопасней...
Вот так, как есть сейчас, вполне тоже можно собрать готовое решение...
ИМХО всё необходимое имеется...

Времени не хватает... :-(

38

Re: HTA,JS: Поверх всех окон

Евген пишет:

Вот так, как есть сейчас, вполне тоже можно собрать готовое решение...
ИМХО всё необходимое имеется...

Ну тогда нужно и APIWrapper и прочие рапперы забанить.
Ок, уберу код либы.

39

Re: HTA,JS: Поверх всех окон

dab00 пишет:

Ок, уберу код либы.

Не-е-е-е...  я с ним имел ввиду...   пускай он-то остаётся...

Времени не хватает... :-(

40

Re: HTA,JS: Поверх всех окон

Что еще? Вроде бы все убрал...

41

Re: HTA,JS: Поверх всех окон

Даже больше чем надо было...

Времени не хватает... :-(

42

Re: HTA,JS: Поверх всех окон

Евген пишет:

Даже больше чем надо было...

Пишу статью про разработку, со всеми исходниками, скоро выложу, если интересно - отправлю ссылки на мыло.

43

Re: HTA,JS: Поверх всех окон

Мне отправьте по возможности .

44 (изменено: dab00, 2011-08-26 17:48:01)

Re: HTA,JS: Поверх всех окон

JSman пишет:

Мне отправьте по возможности .

У меня в подписи ссылка - в разделе "статьи". Не пытайтесь повторить это дома
Могу сравнить этот код с бомбой, в том смысле, что без "средства доставки" он довольно безобиден для окружающих .