1

Тема: Отследить клик по значку HTA на панели задач

Если создать простейшее HTA приложение:


<html><head>
<hta:application

/>
<script>window.resizeTo(200, 140);</script>
</head><body style="background-color: green"></body></html>

то его можно сворачивать несколькими способами, кликая по кнопке 'свернуть' на самом приложении и кликая по значку приложения на панели задач.

Теперь если у приложения убрать внешнюю окантовку:


<html><head>
<hta:application
  border="none"
/>
<script>window.resizeTo(200, 140);</script>
</head><body style="background-color: green"></body></html>

то приложение хоть и появится на панели задач, но щелкая по его иконке никак не удается его (приложение) свернуть.

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

2

Re: Отследить клик по значку HTA на панели задач

Если окно HTA активно, то при щелчке по кнопке на панели задач, оно перестаёт быть активным.
Отсюда вывод: отслеживать получение или утрату окном фокуса и менять при этом значение windowState c "normal" на "minimized".
Но это сопряжено с рядом трудностей:
• Окно будет сворачиваться не только при щелчке на кноке, но и при переключении на другое окно.
• При изменении windowState c "normal" на "minimized" окно действительно сворачивается, но об этом можно не догадаться, т.к. при этом на экране остаётся след от окна, который затирается если поводить над ним указателеи мыши, подвгать окнами… Частично помогает window.blur() перед "minimized" — на других окнах, бывших под HTA следа не остаётся, но на рабочем столе остаётся. Поэтому перед "minimized" я решил убирать окно с экрана, запомнив его расположение.
Вот пример из загашника, он будет работать и при border="none" (хотя в целом, возможно, требует доработки):

<HTML>
<HEAD id="HeadElement">
<META http-equiv='Content-Type' content='text/html; charset=windows-1251'>
<TITLE>Minimize</TITLE>
<HTA:APPLICATION></HTA:APPLICATION>
</HEAD>

<BODY>
<SCRIPT language='JavaScript' type='text/javascript'><!--
var HTA=document.getElementsByTagName("APPLICATION").item(0);
var Left, Top;

function Minimize() {
  Left=window.screenLeft; Top=window.screenTop;
  window.moveTo(0, -16000);

  HTA.removeNode();
  HTA.windowState="minimize";
  HeadElement.appendChild(HTA);

  //window.moveTo(Left, Top);
  window.attachEvent("onfocus", OnRestore)
}

function OnRestore() {
  window.moveTo(Left, Top);
  window.detachEvent("onfocus", OnRestore)
}

document.attachEvent("onkeydown",
  function () {if (event.keyCode==27 /*ESC*/) Minimize();}
);
// --></SCRIPT>

<DIV>Сворачивание окна HTA-приложения по клавише Esc.</DIV>
</BODY></HTML>

• Осталось лишь вместо отслеживания событий клавиатуры отслеживать утрату окном активности и в этом третья трудность, т.к. простой window.onblur срабатывает не только при переключение на другое окно, но и пре передаче фокуса от окна в целом к любому его элементу (например, текстовому полю) — мне самому хотелось бы знать решение этой задачи.

3

Re: Отследить клик по значку HTA на панели задач

Спасибо за комментарий.

Что касается возможности сворачивания HTA приложений силами скриптов, то это делается очень легко.

Я провел небольшое исследование. Создал следующее простое приложение:


<html><head>
<hta:application

/>

<script>

window.resizeTo(300, 140);

setInterval(function () {
    document.title = window.screenLeft + ' x ' + window.screenTop;
}, 50);

</script>
</head><body style="overflow: hidden; background-color: green"></body></html>

Видно что приложение отслеживает свое положение и выводит значение в <title> документа.  <title> можно посмотреть на самом приложении и при наведении на иконку приложения на панели задач:
https://dl.dropbox.com/u/6001712/script-coding/1/scrin-1.jpg


Теперь если свернуть приложение то на панели задач увидим:
https://dl.dropbox.com/u/6001712/script-coding/1/scrin-2.jpg

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


Вопрос насчет минимизации приложений без внешней окантовки, остается открытым.

4

Re: Отследить клик по значку HTA на панели задач

Magneto пишет:

Что касается возможности сворачивания HTA приложений силами скриптов, то это делается очень легко.

В таком случае надо ещё добавить window.blur(), чтобы приложение перестало быть активным и не ловило нажатия клавиш.
При отсутствии окантовки это вполне сгодится в качестве имитации сворачивания, но следует помнить, что если окантовка всё-таки будет, т.е. будет доступен пункт «Восстановить», то работать со «свёрнутыми» таким образом окнам он не станет.

5

Re: Отследить клик по значку HTA на панели задач

Некоторое время назад тоже копал в этом направлении. На истину в последней инстанции не претендую, но вот что выкопал: да, скрыть окно можно, убрав его за пределы экрана, перед этим желательно запомнить в переменной текущие координаты; для восстановления свёрнутого таким образом окна использовал событие window.onfocus - обработчик возвращает окно на запомненное место. Но! window.blur() не сработает. Т.е., если "свернуть" (спрятать) окно по назначенному хоткею, или с помощью элемента графического интерфейса (button) и сразу кликнуть на иконке в панели задач - ничего не произойдёт. Надо кликнуть на чём-нибудь ещё - любом окне или обоях - чтобы окно hta потеряло фокус. Или переключаться по Alt+Tab - тогда фокус будет передан другому окну автоматически. После этого, при клике на значке событие window.onfocus произойдёт. Других событий при клике на значке в панели задач я не обнаружил и свернуть окно таким способом не получилось. Если что-то найдёте - отпишитесь обязательно.

6

Re: Отследить клик по значку HTA на панели задач

Улучшенный (?), по сравнению с #2, пример программного сворачивания окна HTA:

<HTML>
<HEAD id='HeadElement'>
<META http-equiv='Content-Type' content='text/html; charset=windows-1251'>
<TITLE>Minimize</TITLE>

<HTA:APPLICATION></HTA:APPLICATION>
</HEAD>

<BODY>

<SCRIPT language='JavaScript'>
var HTA=document.getElementsByTagName("APPLICATION").item(0);
var WshShell=new ActiveXObject("WScript.Shell");

function Minimize() {
  window.blur();
  HTA.removeNode().windowState="minimize";
  HeadElement.appendChild(HTA);
  window.focus();
  WshShell.Run("RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1 True");
}

document.attachEvent("onkeydown",
  function () {if (event.keyCode==27 /*ESC*/) Minimize();}
);
</SCRIPT>

<DIV>Сворачивание окна HTA-приложения по клавише Esc.</DIV>
</BODY></HTML>

Пояснения:

RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1 True

— перерисовка Рабочего стола для удаления с него следа от окна HTA;
window.focus() добавлен, т.к. иначе после восстановления окна, оно не обрабатывало события клавиатуры пока не щёлкнешь на нём или не нажмёшь TAB — вероятно, из-за предшествующего window.blur().

Недостаток этого решения (как и предшествующего): если программно свернуть окно развёрнутое на весь экран, то после разворачивания назад нельзя будет восстановить первоначальный размер; впрочем, для случая border=none это не существенно.

(Основная задача — отслеживание щелчка по кнопке окна HTA на панели задач или потеря им фокуса — пока не решена.)