Перехват нажатий на такскаре
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.02.09 19:52
Оценка:
Начну из далека (привези мне батенька цветочек аленький...).

У меня на сегодня вместо телефона используется HTC MAX 4G (с WM 6.1).
У него есть один недостаток — слишком мало аппаратных кнопок. По сути для переопределения доступна только кнопка Home (она же кнопка 1, она же домик).
Так вот, пересмотрев все таск-свитчеры я так и не нашело удобного... и родилась в моей голове идея...

Написать так-свитчер который бы работал по следующему принципу. При проведении пальцем по таскбару (т.е. бесполезному заголовку торчащему над большинством приложений) вправо чтобы производилось переключение на следующую задачу. При проведении влево на предыдущую. Тогда можно будет очень легко и удобно переключаться между задачами не открывая при этом лишних окон и не делая лишних движений. При удержании пальца в одном месте (длинном тапе, так что ли это называется?), по моему замыслу, должно открываться окошко в котором будет список кнопок из таскбара (увеличенных до размеров в который можно попасть пальцем (без стилуса)), список активных задач и кнопка открывающая стандартное меню "Старт" винды.

Таким образом мне нужно перехватить нажатия мыши в области таскбара. Возможно при это избегать перехвата кнопки [ОК/x] и кнопки открывающей меню "Старт" (сам пока не решил нужно ли их обходить или просто разбираться с ними в своей программе и пропускать нажатия в управляемом режиме).

Собственно под WM я пока что дела не имел. Так что приветствуются идеи по реализации. Писать скорее всего буду на дотнете. По крайней мере первую версию. Но это не очень важно. Важны идеи о том, как проще и качественнее реализовать данную идею. И о том какие проблемы могут при этом возникнуть.

Как я понимаю подхода тут может быть два:
1. Прозрачное окно перекрывающее верхнюю область винты. Но тут не ясно как сделать окно прозрачным (TopMost не помогает, да и не вижу я что-то флага WS_EX_TRANSPARENT.
2. Как-то подключиться к процессу который отвечает за отрисовку таскбара и за обработку его событий. Конечно не очень красиво (хак), но тоже вариант.

В общем, приветствуются любые мысли.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Перехват нажатий на такскаре
От: Alexander Shargin Россия RSDN.ru
Дата: 27.02.09 20:14
Оценка: 76 (1)
Вот старая, но не потерявшая актуальности статья, где описано, как это сделать:
http://www.pocketpcdn.com/articles/close_app.html

В ней перехватывают нажатие на кнопку X, но с тем же успехом ты перехватишь нажатия в любой точке таскбара. Правда, не знаю, можно ли это сделать из дотнета.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re[2]: Перехват нажатий на такскаре
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.02.09 20:45
Оценка:
Здравствуйте, Alexander Shargin, Вы писали:

AS>Вот старая, но не потерявшая актуальности статья, где описано, как это сделать:

AS>http://www.pocketpcdn.com/articles/close_app.html

AS>В ней перехватывают нажатие на кнопку X, но с тем же успехом ты перехватишь нажатия в любой точке таскбара. Правда, не знаю, можно ли это сделать из дотнета.


То есть предлагается подменить процедуру окна... ОК. Но как я понимаю, окно HHTaskBar разве работает не в отдельном процессе? Не будет ли проблем при подменен процедуры окна из другого процесса?


И еще вопрос. А создать прозрачное окно висящее поверх HHTaskBar не получится?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Перехват нажатий на такскаре
От: Alexander Shargin Россия RSDN.ru
Дата: 27.02.09 21:24
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>То есть предлагается подменить процедуру окна... ОК. Но как я понимаю, окно HHTaskBar разве работает не в отдельном процессе? Не будет ли проблем при подменен процедуры окна из другого процесса?


В Windows CE сабклассинг между процессами работает. Я тоже удивился, когда впервые об этом узнал. Это связано с тем, что потоки в CE умеют мигрировать в другой процесс, чтобы выполнить там обработку сообщений. Например, оконная процедура edit box и других стандартных контролов "живёт" в процессе gwes.exe, который отвечает за windowing и gdi. Когда мы создаём такие контролы в нашем приложении, создавший их поток мигрирует в gwes и обратно.

Есть ряд особенностей — например, если поставить breakpoint в функции окна, назначенной окну "чужого" процесса, то он не сработает. Это происходит потому, что функция на самом деле вызывается в потоке, создавшем окно, который временно мигрирует в наш процесс. Отладчик об этом потоке ничего не знает, поэтому бряк не работает. Ну и конечно, если твоё приложение "упадёт", за ним последует Шелл и весь девайс. Поэтому надо быть особенно осторожным. Например, нельзя "убивать" процесс, засабклассивший таскбар, из Студии. Нужно предусмотреть "graceful shutdown", снимающий хук с таскбара перед завершением приложения.

Насколько я знаю, начиная с CE6 этот способ не работает. Но версий Windows Mobile, построенных на CE6, до сих пор нет. WM7 в очередной раз перенесли на год — теперь ждём её в 2010.

VD>И еще вопрос. А создать прозрачное окно висящее поверх HHTaskBar не получится?


Если только с использованием ещё более жёстких хаков, чем описанный выше. В CE окна принципиально не отрисовываются, находясь под другими окнами — (полу)прозрачности для окон не реализовано.

Ещё один способ решить задачу — подменить драйвер touch-скрина, но это геморно. Я бы в своём приложении выбрал сабклассинг.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re[4]: Перехват нажатий на такскаре
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.02.09 21:52
Оценка:
Здравствуйте, Alexander Shargin, Вы писали:

AS>В Windows CE сабклассинг между процессами работает. Я тоже удивился, когда впервые об этом узнал. Это связано с тем, что потоки в CE умеют мигрировать в другой процесс, чтобы выполнить там обработку сообщений. Например, оконная процедура edit box и других стандартных контролов "живёт" в процессе gwes.exe, который отвечает за windowing и gdi. Когда мы создаём такие контролы в нашем приложении, создавший их поток мигрирует в gwes и обратно.


Эх. Что-то любят грязи развести в МС.

AS>Насколько я знаю, начиная с CE6 этот способ не работает.


Плохо. Это значит, что код прийдется переписывать.

Кстати, я что-то не пойму эту нумерацию. Что значит WM 6.1? И почему это CE 5.x?

AS>Но версий Windows Mobile, построенных на CE6, до сих пор нет. WM7 в очередной раз перенесли на год — теперь ждём её в 2010.


Интересно, что планируется изменить в WM7? И заведется ли он на сегодняшних девайсах?

VD>>И еще вопрос. А создать прозрачное окно висящее поверх HHTaskBar не получится?


AS>Если только с использованием ещё более жёстких хаков, чем описанный выше. В CE окна принципиально не отрисовываются, находясь под другими окнами — (полу)прозрачности для окон не реализовано.


Блин, и это при том, что на дейвайсах уже давно имеются 3D-акселераторы.

AS>Ещё один способ решить задачу — подменить драйвер touch-скрина, но это геморно. Я бы в своём приложении выбрал сабклассинг.


ОК. Попробуем. Тем более, что судя по твоим словам я все смогу сделать из дотнетного процесса, что резко упрощает задачу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Перехват нажатий на такскаре
От: Alexander Shargin Россия RSDN.ru
Дата: 27.02.09 22:29
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Эх. Что-то любят грязи развести в МС.


Этой технологии скоро 15 лет стукнет. На тот момент она позволила снизить оверхед на вызовы функций в системных процессах (поток мигрирует в сервисный процесс вместе со своим стеком, где уже лежат все переданные параметры — не надо ничего копировать и т. д.).

AS>>Насколько я знаю, начиная с CE6 этот способ не работает.


VD>Плохо. Это значит, что код прийдется переписывать.


А что делать.

VD>Кстати, я что-то не пойму эту нумерацию. Что значит WM 6.1? И почему это CE 5.x?


Windows CE и Windows Mobile — это разные операционные системы, и у каждой своя нумерация. Windows Mobile использует ядро CE, но пользовательский интерфейс и набор приложений — свои собственные. А сама CE используется во встроенных системах, там где XP/Vista Embedded тяжеловаты для использования.

VD>Интересно, что планируется изменить в WM7? И заведется ли он на сегодняшних девайсах?


На сегодняшних девайсах — маловероятно. На девайсах ситуация вообще сложная — далеко не всегда старый девайс можно перепрошить на новую ОС, даже если аппаратно она могла бы там крутиться. Дело в том, что Windows Mobile "в чистом виде" для конечного пользователя не существует — есть лишь прошивки, в которые входит сама ось вместе с OAL, набором драйверов и т. д. Для каждого девайса прошивки свои, делают их сами производители девайсов. И так как им хочется продавать новые девайсы, выпускать новые прошивки для старых никто особо не рвётся.

Что будет нового в WM7 — хз. Они только-только анонсировали 6.5, а в семёрке ещё десять раз всё поменяется до рпелиза.

VD>Блин, и это при том, что на дейвайсах уже давно имеются 3D-акселераторы.


Акселераторы есть далеко не на всех девайсах, и сама ось их не использует. Как правило, акселератор юзает пара приложений от производителя устройства, плюс можно подружить с ним третьсторонние, если немного потрахаться. Причём нет никакой гарантии совместимости между акселераторами, хотя API и стандартный (OpenGL ES).

VD>ОК. Попробуем. Тем более, что судя по твоим словам я все смогу сделать из дотнетного процесса, что резко упрощает задачу.


Расскажи потом, что получится. Дотнет на девайсах кастрированный, иногда проблемы вылезают там, где их совершенно не ждёшь. Например, вообще нельзя загрузить в нативный процесс managed DLL (наоборот — пожалуйста).
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re[6]: Перехват нажатий на такскаре
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.02.09 01:42
Оценка:
Здравствуйте, Alexander Shargin, Вы писали:

AS>Этой технологии скоро 15 лет стукнет. На тот момент она позволила снизить оверхед на вызовы функций в системных процессах (поток мигрирует в сервисный процесс вместе со своим стеком, где уже лежат все переданные параметры — не надо ничего копировать и т. д.).


Э... не уж то так время летит?

AS>Windows CE и Windows Mobile — это разные операционные системы, и у каждой своя нумерация. Windows Mobile использует ядро CE, но пользовательский интерфейс и набор приложений — свои собственные. А сама CE используется во встроенных системах, там где XP/Vista Embedded тяжеловаты для использования.


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

VD>>Интересно, что планируется изменить в WM7? И заведется ли он на сегодняшних девайсах?


AS>На сегодняшних девайсах — маловероятно. На девайсах ситуация вообще сложная — далеко не всегда старый девайс можно перепрошить на новую ОС, даже если аппаратно она могла бы там крутиться. Дело в том, что Windows Mobile "в чистом виде" для конечного пользователя не существует — есть лишь прошивки, в которые входит сама ось вместе с OAL, набором драйверов и т. д. Для каждого девайса прошивки свои, делают их сами производители девайсов. И так как им хочется продавать новые девайсы, выпускать новые прошивки для старых никто особо не рвётся.


Только вчера скачали и обновили прошивку для ETEN Glofish X500+. Была она на WM 6.0, стала на 6.1. Но прошивка не родная, а сделаная нашими умельцами.
Для своего HTC MAX я буквально в начале года качал новую прошивку устраняющую некоторые баги и недоработки.
Так что все не так уж страшно. Не производитель так народные умельцы сделают все что нужно .

VD>>ОК. Попробуем. Тем более, что судя по твоим словам я все смогу сделать из дотнетного процесса, что резко упрощает задачу.


AS>Расскажи потом, что получится. Дотнет на девайсах кастрированный, иногда проблемы вылезают там, где их совершенно не ждёшь. Например, вообще нельзя загрузить в нативный процесс managed DLL (наоборот — пожалуйста).


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

Донет в таких условиях работает, но проблемы все же есть. В одном приложении не удалось создать обычный дотнетный месэдж-луп и перехватчик сообщений окна HHTaskBar (так в CE окно таскбара называется, если кто не в курсе).
Пока что тест ограничился проверкой работоспособности самой идеи.
На сегодня я реализовал перехват WM_LBUTTONDOWN у HHTaskBar и выдачу диалога спрашивающего "Пропустить нажатие дальше?" или нет. Нажимаем "Yes" и вызывается исходная оконная процедура которая выполняет обычные действия. Если нажимаем "No", то ничего не делается. Область с кнокой [OK/x] из рассмотрения исключается, так что программы по прежнему можно закрывать без предупреждения. В первом варианте на них тоже выдавались предупреждения, но оказалось, что после потери фокуса закрытие приложений не происходит (видимо делают захват мышиного ввода который обрывается с потерей фокуса). В конечном итоге меня это не трогает, так как я не собираюсь открывать диалоги. Мне нужно всего лишь обрабатывать сдвиг пальцем вправо и влево.

Собственно исходники и бинарники можно взять здесь.
http://files.rsdn.ru/73/HHTaskBar_Subclass_Test.zip
Вроде работает, но если что софтрезет вам в помощь .
Софтрезет так же потребуется чтобы завершить работы приложения, так как шататного выхода нет, а все испробованные мной таскменеджеры попросту не видят этого процесса (окон ведь в нем нет). Хотя можно пробовать снять приложение в то время когда открыт диалог (не уверен, что выйдет, так как он же из процесса таскбара лезть должен).

А вот и исходник (большая часть кода и времени занял импорт API, так что не очень ясно есть ли преимущество в дотнете или нет... дотнет пока что используется как безопасный С ):
using System;
using System.Linq;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Threading;
using System.Runtime.InteropServices;
using System.Drawing;

static class Program
{
  // this is the new wndproc, just show a messagebox on left button down:
  private static int MyWndProc(IntPtr hWnd, int msg, int wParam, int lParam)
  {
    switch (msg)
    {
      case WM_LBUTTONDOWN:
        var rc = GetWindowRect(hWnd);
        var xPos = LoWord(lParam); 
        var yPos = HiWord(lParam);

        // if click in close button...
        if (xPos > rc.Width - rc.Height)
          break; // do default behavior

        // asc user for do default behavior
        if (MessageBox.Show( "Пропустить нажатие дальше?",  "Злостный перехватчик", 
          MessageBoxButtons.YesNo, MessageBoxIcon.Question, 
          MessageBoxDefaultButton.Button1) == DialogResult.Yes
        )
          break;
        else
          return 0;

      default:
        break;
    }

    return CallWindowProcCE(_oldWndProc, hWnd, msg, wParam, lParam);
  }
  
  /// <summary>
  /// The main entry point for the application.
  /// </summary>
  [MTAThread]
  static void Main()
  {
    var hhTaskBar = FindWindowCE("HHTaskBar", null);

    if (hhTaskBar != IntPtr.Zero)
    {
      _newWndProc = MyWndProc;
      _oldWndProc = SetWindowLongCE(hhTaskBar, GWL_WNDPROC, _newWndProc);

      MessageBox.Show(string.Format("handle is 0x{0:X} oldWndProc is 0x{1:X}",
        hhTaskBar.ToInt32(),
        _oldWndProc.ToInt32()));
    }

    Thread.Sleep(Timeout.Infinite); // kipe address space of process!!!
  }

  // Import of system API...

  [DllImport("coredll.dll", EntryPoint = "FindWindowW", SetLastError = true)]
  private static extern IntPtr FindWindowCE(string lpClassName, string lpWindowName);

  [DllImport("coredll.dll", SetLastError = true, EntryPoint = "GetWindowLong")]
  private static extern IntPtr GetWindowLongCE(IntPtr hWnd, int nIndex);

  [DllImport("coredll.dll", SetLastError = true, EntryPoint = "SetWindowLong")]
  private static extern IntPtr SetWindowLongCE(IntPtr hWnd, int nIndex, IntPtr dwNewLong);

  [DllImport("coredll.dll", SetLastError = true, EntryPoint = "SetWindowLong")]
  private static extern IntPtr SetWindowLongCE(IntPtr hWnd, int nIndex, Win32WndProc newProc);

  [DllImport("coredll.dll", EntryPoint = "CallWindowProc")]
  private static extern int CallWindowProcCE(IntPtr wProc, IntPtr hWnd, int uMsg, int wParam, int lParam);

  [DllImport("coredll.dll")]
  [return: MarshalAs(UnmanagedType.Bool)]
  static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);

  static RECT GetWindowRect(IntPtr hWnd)
  {
    RECT rect = new RECT();

    GetWindowRect(hWnd, out rect);

    return rect;
  }

  static int LoWord(int lParam)
  {
    return lParam & 0xFFFF;
  }

  static int HiWord(int lParam)
  {
    return 16 >> lParam;
  }

  private delegate int Win32WndProc(IntPtr hWnd, int Msg, int wParam, int lParam);

  const int GWL_WNDPROC = -4;
  const int WM_LBUTTONDOWN = 0x0201;
  static Win32WndProc _newWndProc = null;
  static IntPtr _oldWndProc = IntPtr.Zero;
}

/// <summary>Win32 RECT structure</summary>
public struct RECT
{
  public RECT(int left, int top, int right, int bottom)
  {
    this.Left = left;
    this.Top = top;
    this.Right = right;
    this.Bottom = bottom;
  }

  public RECT(System.Drawing.Point topLeft, System.Drawing.Size size)
  {
    this.Left = topLeft.X;
    this.Top = topLeft.Y;
    this.Right = topLeft.X + size.Width;
    this.Bottom = topLeft.Y + size.Height;
  }

  public int Left;
  public int Top;
  public int Right;
  public int Bottom;

  public int Width { get { return Right - Left; } }
  public int Height { get { return Bottom - Top; } }

  public Size Size { get { return new Size(Width, Height); } }

  public Point Location { get { return new Point(Left, Top); } }

  // Handy method for converting to a System.Drawing.Rectangle
  public Rectangle ToRectangle()
  { return Rectangle.FromLTRB(Left, Top, Right, Bottom); }

  public static RECT FromRectangle(Rectangle rectangle) 
  {
    return new RECT(rectangle.Left, rectangle.Top, rectangle.Right, rectangle.Bottom);
  }

  public override int GetHashCode() 
  {
    return Left ^ ((Top << 13) | (Top >> 0x13))
      ^ ((Width << 0x1a) | (Width >> 6))
      ^ ((Height << 7) | (Height >> 0x19));
  }

  #region Operator overloads

  public static implicit operator Rectangle( RECT rect )
  {
    return rect.ToRectangle();      
  }

  public static implicit operator RECT( Rectangle rect )
  {
    return FromRectangle(rect);
  }

  #endregion
}
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Перехват нажатий на такскаре
От: hattab  
Дата: 28.02.09 11:12
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>У меня на сегодня вместо телефона используется HTC MAX 4G (с WM 6.1).

VD>У него есть один недостаток — слишком мало аппаратных кнопок. По сути для переопределения доступна только кнопка Home (она же кнопка 1, она же домик).
VD>Так вот, пересмотрев все таск-свитчеры я так и не нашело удобного... и родилась в моей голове идея...
...
VD>В общем, приветствуются любые мысли.

MagicButton смотрел? Я пользовался, удобная штука.
Re: Перехват нажатий на такскаре
От: Аноним  
Дата: 28.02.09 12:22
Оценка: 38 (1)
Здравствуйте, VladD2, Вы писали:

VD>Начну из далека (привези мне батенька цветочек аленький...).


VD>У меня на сегодня вместо телефона используется HTC MAX 4G (с WM 6.1).

VD>У него есть один недостаток — слишком мало аппаратных кнопок. По сути для переопределения доступна только кнопка Home (она же кнопка 1, она же домик).

Неплохая программа для переопределения кнопок AE Button Plus.

VD>Так вот, пересмотрев все таск-свитчеры я так и не нашело удобного...


WkTASK смотрели?
Re[2]: Перехват нажатий на такскаре
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.02.09 18:17
Оценка:
Здравствуйте, hattab, Вы писали:

H>MagicButton смотрел? Я пользовался, удобная штука.


Я его даже ставить не стал. Он рассчитан на стилус, а мне нужен пальце-ориентированный интерфейс.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Перехват нажатий на такскаре
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.02.09 18:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Неплохая программа для переопределения кнопок AE Button Plus.


Я же говорю — кнопок на зверьке очень мало. Есть только одна незадействованная (точнее выполняющая не очень нужную функцию — открытие тудэя). Так что переопределять просто не чего. Не отказываться же от телефонных кнопок?

VD>>Так вот, пересмотрев все таск-свитчеры я так и не нашело удобного...


А>WkTASK смотрели?


Поглядел. Опять не то что нужно. У этой софтины интерфейс не пальце ориентированный. Идея сделать из таскбара список задач (как на ББ), на мой взгляд, тоже неудачная.

Лончер же мне просто не нужен. В Yota сделан весьма приличный лончер. Именно его я сейчас и зашил на единственную доступную кнопку.

Мне хочется чтобы работа с двумя-тремя задачами была бы максимально простой. Чтобы можно было в одно касание переключаться между ними. Это особенно нужно когда нужно копировать информацию из одной программы в другую.

"Сдвиг" вправо/влево по таскбару, на мой взгляд — это оптимальное действие для переключение задач. Его можно делать большим пальцем держа телефон одной рукой (или пальцем другой руки).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Перехват нажатий на такскаре
От: std.denis Россия  
Дата: 28.02.09 18:45
Оценка:
А>>Неплохая программа для переопределения кнопок AE Button Plus.
VD>Я же говорю — кнопок на зверьке очень мало
думаю смысл рекомендации AEB+ был в том, что там на одну кнопку можно повесить несколько действий — одиночное нажатие, двойное, тройное.

VD>>>Так вот, пересмотрев все таск-свитчеры я так и не нашело удобного...

Может просто написать удобный себе таск-манагер и повесить его на Кнопку 1 ?

Есть еще полезняшка FTouchSL, которая еще и дает возможность повесить действие на жесты.
Re[2]: Перехват нажатий на такскаре
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.02.09 20:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Неплохая программа для переопределения кнопок AE Button Plus.


Поставил, попробовал...

Программа действительно не плохая. Но она позволят настроить только одну кнопку на моем зверьке.
Пока что поставил ее. Но все же иметь более удобный переключатель задач был бы не плохо.

Эх где бы найти лишнее время...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Перехват нажатий на такскаре
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.02.09 21:41
Оценка:
Здравствуйте, std.denis, Вы писали:

А>>>Неплохая программа для переопределения кнопок AE Button Plus.

VD>>Я же говорю — кнопок на зверьке очень мало
SD>думаю смысл рекомендации AEB+ был в том, что там на одну кнопку можно повесить несколько действий — одиночное нажатие, двойное, тройное.

Да, я оценил это приложение. Только более дувх действий реально повесить не удается. Длинный тап и трипл не работают как хочется.
Но на безрыбие и это не плохо.
Сейчас повесил на "Хоум" таскменеджер по одному нажатию и Yota Center (програм-лончер) на двойное нажатие.
Но хочется иметь возможность легко переключать задачи взад-вперед.
К сожалению перехватить кнопки отличные от хоумскриновой не удалось. Yota-вский софт перехватывает нажатие при первом запуске и дальше начинается вакханалия. Отказываться от звонилки и контактов Yota нет ни какого желания. Они очень удобны.

VD>>>>Так вот, пересмотрев все таск-свитчеры я так и не нашело удобного...

SD>Может просто написать удобный себе таск-манагер и повесить его на Кнопку 1 ?

SD>Есть еще полезняшка FTouchSL, которая еще и дает возможность повесить действие на жесты.


Поглядел... Это не то что я хотел бы видеть. Хотя и близко к тому. На HTC MAX слишком много программ которые сами работают точ-интерфейсом. Так что в половине случае перехват этих функций будет неудобен.

Так что точ-интерфейс на таск-скрине видится мне самым удобным решением для переключения задач. Тем более, что область системная...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.