Автокликер Clickermann :: Форум

Основной раздел => Общие вопросы => Topic started by: Hito on July 14, 2018, 10:33:20 AM

Title: Как получить хендл активного окна?
Post by: Hito on July 14, 2018, 10:33:20 AM
 ???

Объясню ситуацию... Мне нужно, чтобы в нужный момент кликер запомнил хендл активного окна, потом вывел бы на передний план окно, с которым он работает, отвязался бы от него, сделал бы все, что нужно, опять привязался бы к нему, а потом снова вывел бы на передний план то окно, которое было активным изначально.
Title: Re: Как получить хендл активного окна?
Post by: Hito on July 14, 2018, 01:01:21 PM
В общем если кому понадобится...
https://yadi.sk/d/LTn2l-J53ZARLk (https://yadi.sk/d/LTn2l-J53ZARLk)
Кидаем все три файла в одну папку.
Title: Re: Как получить хендл активного окна?
Post by: i0 on July 14, 2018, 07:45:21 PM
11 мегабайт для поиска активного окна? это на чём такие шедевры?
меня за такое ещё ругали. какой же я устаревший:)
Title: Re: Как получить хендл активного окна?
Post by: Hito on July 14, 2018, 08:12:28 PM
11 мегабайт для поиска активного окна? это на чём такие шедевры?
меня за такое ещё ругали. какой же я устаревший:)
На Delphi
Code: [Select]
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, inifiles, Tlhelp32;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    function KillTask(ExeFileName: string): Integer;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  HD:HWND;
  Ini: TIniFile;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  HD:= GetForegroundWindow;
  Ini := TiniFile.Create(extractfilepath(paramstr(0))+('variables.ini'));
  Ini.WriteInteger('ID of active window', 'window', HD);
  Ini.WriteInteger('ID of active window', 'action', 1);
  Ini.Free;
  KillTask('ID_active_window.exe');
end;

function TForm1.KillTask(ExeFileName: string): Integer;
const
  PROCESS_TERMINATE = $0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  Result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

  while Integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
      UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
      UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess(
                        OpenProcess(PROCESS_TERMINATE,
                                    BOOL(0),
                                    FProcessEntry32.th32ProcessID),
                                    0));
     ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

end.
Title: Re: Как получить хендл активного окна?
Post by: i0 on July 14, 2018, 08:15:54 PM
кликерман написан на делфи. он как-то поменьше даже с картинками и звуками
Title: Re: Как получить хендл активного окна?
Post by: Hito on July 14, 2018, 08:18:43 PM
кликерман написан на делфи. он как-то поменьше даже с картинками и звуками
Ну хз... Листинг ты видишь. Там больше ничего нет.
И картинки со звуками у кликермана не в эксешнике же хронятся...?
Title: Re: Как получить хендл активного окна?
Post by: i0 on July 14, 2018, 08:31:44 PM
я вспоминал размер архива кликермана, он примерно такой же, как твой модуль, упакованный в rar, и несравним по функционалу. не, ты молодец, сам разобрался и написал, но надо оптимизировать как-то

я вообще 20+ лет не писал на норм языках, но когда это делал, код получался "несколько меньшего размера"
Title: Re: Как получить хендл активного окна?
Post by: i0 on July 14, 2018, 08:39:34 PM
прошу помощи Johnny. он у нас гуру делфи. и хэндлы ему весьма знакомы;)
Title: Re: Как получить хендл активного окна?
Post by: Hito on July 14, 2018, 09:04:43 PM
но надо оптимизировать как-то
Там основной код в процедуре KillTask - уничтожение процесса. Вот его наверняка можно оптимизировать. Просто я сделал, чтобы прога делала все и уничтожалась еще до своего появления.
Title: Re: Как получить хендл активного окна?
Post by: dramster on July 14, 2018, 09:15:34 PM
 :-\  первая же ссылка в поиске по данному вопросу выдала  мне код в одну строку -
Handle := GetForegroundWindow();

закинул в длл. вызов с помощью CALL.

код делфи:
Code: (javascript) [Select]
library cmann_plugin;

uses
  Windows,
  SysUtils;

//------------------------------------------------------------------------------
// Основное тело функции, идет на экспорт, вызывается из кликера
function execute( _mas: pInteger; _size: Integer): Integer; export; stdcall;
type
  pIntArr = array[0..0] of Integer;

begin
   result :=  GetForegroundWindow(); // присваиваем возвращаемое значение
end;
//------------------------------------------------------------------------------

// список экспорта
exports execute;

begin
  // тело пусто
end.

проверяем кликерманом:
Code: (clickermann) [Select]
CALL("handle.dll")
print($_return1)
halt

длл во вложении.
Title: Re: Как получить хендл активного окна?
Post by: Hito on July 14, 2018, 09:20:06 PM
:-\  первая же ссылка в поиске по данному вопросу выдала  мне код в одну строку -
Handle := GetForegroundWindow();
А у меня эта функция в несколько строк что ль...?   ???

закинул в длл. вызов с помощью CALL.
То есть - теперь в одну паку уже не три, а четыре файла кидать надо?  ;D

Я вот сейчас создал пустой проект и скомпилировал его, не написав в нем ни строчки. Не на много он меньше стал...
https://yadi.sk/i/jywy88EG3ZAzfd (https://yadi.sk/i/jywy88EG3ZAzfd)
Title: Re: Как получить хендл активного окна?
Post by: dramster on July 14, 2018, 09:23:09 PM
закинул в длл. вызов с помощью CALL.
То есть - теперь в одну паку уже не три, а четыре файла кидать надо?  ;D


почему четыре? наоборот, при вызове длл уже не требуется ини, значение сразу возвращается в переменную $_return1. файл один - handle.dll , ... и все, вызываем когда требуется.

а насчет
Quote
А у меня эта функция в несколько строк что ль...?
это да, таже функция и у тебя присутствует, только вот все остальное... это уже сложнее для понимания  ;D . я думал что главное хендл прочитать и передать кликеру, а тут во как оно все замудрено.
Title: Re: Как получить хендл активного окна?
Post by: Hito on July 14, 2018, 09:26:12 PM
Ну, я хз. Я с dll-ками ленюсь разобраться капитально и до сих пор с ними не работаю )) Я сделал, что мог. Я совсем не против, если кто-то выложит костыль помоднее ))) А насчет размеров файла - реально не код в нем столько весит. Посмотри скрин, там пустой эксешник весит больше 10мб.
Title: Re: Как получить хендл активного окна?
Post by: Hito on July 14, 2018, 09:30:34 PM
Code: (clickermann) [Select]
CALL("handle.dll")
print($_return1)
halt
Может все же $_return1 заменить на что-нибудь типа - $hd? )) Ато $_return1 как бы используем мы в кликере...))
Title: Re: Как получить хендл активного окна?
Post by: dramster on July 14, 2018, 09:36:41 PM
Code: (clickermann) [Select]
CALL("handle.dll")
print($_return1)
halt
Может все же $_return1 заменить на что-нибудь типа - $hd? )) Ато $_return1 как бы используем мы в кликере...))

 :-\ немного непонятно о чем ты... Этот код мы тоже используем в кликере, и CALL возвращает  значение именно в системную переменную $_return1, также как и некоторые другие "функции" в кликермане. Смотрим в справку  :D.
Title: Re: Как получить хендл активного окна?
Post by: Hito on July 14, 2018, 09:40:56 PM
:-\ немного непонятно о чем ты... Этот код мы тоже используем в кликере, и CALL возвращает  значение именно в системную переменную $_return1, также как и некоторые другие "функции" в кликермане. Смотрим в справку  :D.
А ты сам вообще тестил свое произведение? У меня оно вообще непонятный id показывает... Явно не того окна, которое активно...
Какое бы окно не было активно, оно выдает одно и то же - 546
Title: Re: Как получить хендл активного окна?
Post by: dramster on July 14, 2018, 09:46:36 PM
(https://i.imgur.com/OTTwOk9.png)


вроде работает  :-\
Title: Re: Как получить хендл активного окна?
Post by: dramster on July 14, 2018, 09:52:35 PM
если речь идет именно про id, то есть HGETPID в кликермане. Я думаю все помнят  :D
Title: Re: Как получить хендл активного окна?
Post by: Hito on July 14, 2018, 10:01:49 PM
вроде работает  :-\

https://imgur.com/a/6FP9i3f (https://imgur.com/a/6FP9i3f)
Title: Re: Как получить хендл активного окна?
Post by: Hito on July 14, 2018, 10:08:21 PM
если речь идет именно про id, то есть HGETPID в кликермане. Я думаю все помнят  :D
При чем тут родительский процесс...? id и хендл - одно и то же )))
Title: Re: Как получить хендл активного окна?
Post by: dramster on July 14, 2018, 10:09:31 PM
де работает  :-\

https://imgur.com/a/6FP9i3f (https://imgur.com/a/6FP9i3f)

 Может у тебя версия кликермана не последняя? В бета версиях гдето до v13.012b вызов длл не работал. Файл "handle.dll" рядом со скриптом лежит? Попробуй закинь в папку %Clickermann%/plugins, как написано в справке. Как видишь, у меня работает  :-\.
 Мож кто еще потестит... ?
Title: Re: Как получить хендл активного окна?
Post by: Hito on July 14, 2018, 10:14:12 PM
Может у тебя версия кликермана не последняя? В бета версиях гдето до v13.012b вызов длл не работал. Файл "handle.dll" рядом со скриптом лежит? Попробуй закинь в папку %Clickermann%/plugins, как написано в справке. Как видишь, у меня работает  :-\.
 Мож кто еще потестит... ?

https://imgur.com/7HeiMuS (https://imgur.com/7HeiMuS)
Версия последняя
Title: Re: Как получить хендл активного окна?
Post by: dramster on July 14, 2018, 10:23:11 PM
Может у тебя версия кликермана не последняя? В бета версиях гдето до v13.012b вызов длл не работал. Файл "handle.dll" рядом со скриптом лежит? Попробуй закинь в папку %Clickermann%/plugins, как написано в справке. Как видишь, у меня работает  :-\.
 Мож кто еще потестит... ?

https://imgur.com/7HeiMuS (https://imgur.com/7HeiMuS)
Версия последняя

Ну что я могу сказать... :-\ ? Я без понятия почему так. Чтото с вызовом длл у тебя. Кстати, то что написано в справке насчет "директории %Clickermann%/plugins", проверил, не работает. Работает если только сама длл рядом со скриптом, ну или если писать полный или относительный путь к файлу при вызове.
 Попробуй сам скомпилировать тестовую длл, ну или свою напиши. Тестовый код есть в версии км 4.7. Кинул во вложение.
Title: Re: Как получить хендл активного окна?
Post by: Hito on July 14, 2018, 10:28:23 PM
Попробуй сам скомпилировать тестовую длл, ну или свою напиши. Тестовый код есть в версии км 4.7. Кинул во вложение.
У меня твоя версия сразу кучу ошибок выдает. Я уже говорил - мне еще разбираться с дллками надо... Ты в архив закинь свой кликер, скрипт и дллку. Я попробую.
Title: Re: Как получить хендл активного окна?
Post by: dramster on July 14, 2018, 10:36:59 PM
https://yadi.sk/d/v-Ue9jFo3ZB74x

Проверил - скачал, разархивировал, открыл "test.cms" именно этим кликером, запустил, работает как положено  :D
Title: Re: Как получить хендл активного окна?
Post by: Hito on July 14, 2018, 10:42:24 PM
Странно... С твоего все работает... А че у меня с кликером...?
Title: Re: Как получить хендл активного окна?
Post by: dramster on July 14, 2018, 10:46:45 PM
Странно... С твоего все работает... А че у меня с кликером...?

Проверил, скачал последнюю версию http://crapware.aidf.org/page/clickermann х32, вроде работает. Мож что-то с х64 ? Не могу проверить, винда х32.
Title: Re: Как получить хендл активного окна?
Post by: Hito on July 14, 2018, 10:50:00 PM
Странно... С твоего все работает... А че у меня с кликером...?

Проверил, скачал последнюю версию http://crapware.aidf.org/page/clickermann х32, вроде работает. Мож что-то с х64 ? Не могу проверить, винда х32.
Ааа... У тебя х32? У меня х64. Значит с ней что-то не так в этом отношении...
Title: Re: Как получить хендл активного окна?
Post by: Johnny on July 17, 2018, 04:14:43 PM
честно говоря этот момент особо не смотрел и не тестил, но битность библиотеки и программы как бы должны совпадать.
поэтому если кто там уже длл"ки пишет - компилируйте в соответствующую разрядность.