Изучаем nag screen Total Commander

7 Ноя
2011


Nag screen во все времена привлекали интерес к себе. Вот и сейчас попробуем более детально изучить это окно.

Total Commander это окно имеет интересную концепцию. Для того что бы его закрыть достаточно нажать одну из кнопок. Это не так раздражает чем ожидание таймера в других подобных решениях.
Давайте более подробно изучим структуру этого окна.

Дерево классов окна можно посмотреть в любом сканере окон например в плагине для того же Total Commander Task manager.

Интересующие нас элементы показаны ниже:

TNASTYNAGSCREEN - Total Commander
  |
   - TNotebook
    |
     - TPage - UserPage
      |
       - TPanel
        |
         - TPanel - номер кнопки
        |
         - TButton - &1
        |
         - TButton - &2
        |
         - TButton - &3


Попробуем написать код для автоматизации процесса запуска. Для этого будем использовать Delphi.
program TCLauncher;

uses
  shellapi,
  SysUtils,
  Windows,
  Messages;

{$R *.res}
var
  lHwnd: HWND;   //Hndle окно
  lChS: array [0 .. 255] of char;  //текст окна
  lS: string;    //строка текста окна
  lBtnNum: string;  //номер искомой кнопки
  lCnt: integer;     //переменная для предотвращения бесконечного цикла
begin
  ShellExecute(0, 'open', 'TOTALCMD.EXE', '', '', SW_NORMAL);
  lCnt := 0;
  repeat
    lHwnd := FindWindow('TNASTYNAGSCREEN', 'Total Commander');
    lHwnd := GetWindow(lHwnd, GW_CHILD);    //TNotebook
    lHwnd := GetWindow(lHwnd, GW_CHILD);    //TPage - UserPage
    lHwnd := GetWindow(lHwnd, GW_CHILD);    //TPanel
    lHwnd := GetWindow(lHwnd, GW_CHILD);    //TPanel - номер кнопки
    GetWindowText(lHwnd, lChS, Length(lChS));  //получаем номер кнопки
    lBtnNum := lChS;

    while lHwnd <> 0 do
    begin
      lHwnd := GetNextWindow(lHwnd, gw_HWndNext);    //перебираем кнопки
      GetWindowText(lHwnd, lChS, Length(lChS));             //текст кнопки
      lS := lChS;
      if CompareText(lS, '&' + lBtnNum) = 0 then begin      //сравниваем
        SendMessage(lHwnd, BM_CLICK, 0, 0);  // посылаем сообщение клика
        exit;
      end;
    end; //while

    inc(lCnt)
    sleep(100);
  until (lCnt > 50);  // 5 секнд
end.

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



загрузка...

Комментарии:

Наверх