Author Topic: Как получить хендл активного окна?  (Read 6335 times)

0 Members and 1 Guest are viewing this topic.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
 ???

Объясню ситуацию... Мне нужно, чтобы в нужный момент кликер запомнил хендл активного окна, потом вывел бы на передний план окно, с которым он работает, отвязался бы от него, сделал бы все, что нужно, опять привязался бы к нему, а потом снова вывел бы на передний план то окно, которое было активным изначально.
« Last Edit: July 14, 2018, 09:06:11 PM by Hito »
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Как получить хендл активного окна?
« Reply #1 on: July 14, 2018, 01:01:21 PM »
В общем если кому понадобится...
https://yadi.sk/d/LTn2l-J53ZARLk
Кидаем все три файла в одну папку.
Я не ду... Потому и не бу...

i0

  • Оплот сообщества
  • ****
  • Posts: 353
  • CMann 4.13.014 final, ie, presto, win7 x86, x64
    • View Profile
Re: Как получить хендл активного окна?
« Reply #2 on: July 14, 2018, 07:45:21 PM »
11 мегабайт для поиска активного окна? это на чём такие шедевры?
меня за такое ещё ругали. какой же я устаревший:)
« Last Edit: July 14, 2018, 07:46:57 PM by i0 »

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Как получить хендл активного окна?
« Reply #3 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.
Я не ду... Потому и не бу...

i0

  • Оплот сообщества
  • ****
  • Posts: 353
  • CMann 4.13.014 final, ie, presto, win7 x86, x64
    • View Profile
Re: Как получить хендл активного окна?
« Reply #4 on: July 14, 2018, 08:15:54 PM »
кликерман написан на делфи. он как-то поменьше даже с картинками и звуками

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Как получить хендл активного окна?
« Reply #5 on: July 14, 2018, 08:18:43 PM »
кликерман написан на делфи. он как-то поменьше даже с картинками и звуками
Ну хз... Листинг ты видишь. Там больше ничего нет.
И картинки со звуками у кликермана не в эксешнике же хронятся...?
« Last Edit: July 14, 2018, 09:06:51 PM by Hito »
Я не ду... Потому и не бу...

i0

  • Оплот сообщества
  • ****
  • Posts: 353
  • CMann 4.13.014 final, ie, presto, win7 x86, x64
    • View Profile
Re: Как получить хендл активного окна?
« Reply #6 on: July 14, 2018, 08:31:44 PM »
я вспоминал размер архива кликермана, он примерно такой же, как твой модуль, упакованный в rar, и несравним по функционалу. не, ты молодец, сам разобрался и написал, но надо оптимизировать как-то

я вообще 20+ лет не писал на норм языках, но когда это делал, код получался "несколько меньшего размера"

i0

  • Оплот сообщества
  • ****
  • Posts: 353
  • CMann 4.13.014 final, ie, presto, win7 x86, x64
    • View Profile
Re: Как получить хендл активного окна?
« Reply #7 on: July 14, 2018, 08:39:34 PM »
прошу помощи Johnny. он у нас гуру делфи. и хэндлы ему весьма знакомы;)

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Как получить хендл активного окна?
« Reply #8 on: July 14, 2018, 09:04:43 PM »
но надо оптимизировать как-то
Там основной код в процедуре KillTask - уничтожение процесса. Вот его наверняка можно оптимизировать. Просто я сделал, чтобы прога делала все и уничтожалась еще до своего появления.
Я не ду... Потому и не бу...

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Как получить хендл активного окна?
« Reply #9 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

длл во вложении.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Как получить хендл активного окна?
« Reply #10 on: July 14, 2018, 09:20:06 PM »
:-\  первая же ссылка в поиске по данному вопросу выдала  мне код в одну строку -
Handle := GetForegroundWindow();
А у меня эта функция в несколько строк что ль...?   ???

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

Я вот сейчас создал пустой проект и скомпилировал его, не написав в нем ни строчки. Не на много он меньше стал...
https://yadi.sk/i/jywy88EG3ZAzfd
« Last Edit: July 14, 2018, 09:23:13 PM by Hito »
Я не ду... Потому и не бу...

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Как получить хендл активного окна?
« Reply #11 on: July 14, 2018, 09:23:09 PM »
закинул в длл. вызов с помощью CALL.
То есть - теперь в одну паку уже не три, а четыре файла кидать надо?  ;D


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

а насчет
Quote
А у меня эта функция в несколько строк что ль...?
это да, таже функция и у тебя присутствует, только вот все остальное... это уже сложнее для понимания  ;D . я думал что главное хендл прочитать и передать кликеру, а тут во как оно все замудрено.
« Last Edit: July 14, 2018, 09:26:52 PM by dramster »

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Как получить хендл активного окна?
« Reply #12 on: July 14, 2018, 09:26:12 PM »
Ну, я хз. Я с dll-ками ленюсь разобраться капитально и до сих пор с ними не работаю )) Я сделал, что мог. Я совсем не против, если кто-то выложит костыль помоднее ))) А насчет размеров файла - реально не код в нем столько весит. Посмотри скрин, там пустой эксешник весит больше 10мб.
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Как получить хендл активного окна?
« Reply #13 on: July 14, 2018, 09:30:34 PM »
Code: (clickermann) [Select]
CALL("handle.dll")
print($_return1)
halt
Может все же $_return1 заменить на что-нибудь типа - $hd? )) Ато $_return1 как бы используем мы в кликере...))
Я не ду... Потому и не бу...

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Как получить хендл активного окна?
« Reply #14 on: July 14, 2018, 09:36:41 PM »
Code: (clickermann) [Select]
CALL("handle.dll")
print($_return1)
halt
Может все же $_return1 заменить на что-нибудь типа - $hd? )) Ато $_return1 как бы используем мы в кликере...))

 :-\ немного непонятно о чем ты... Этот код мы тоже используем в кликере, и CALL возвращает  значение именно в системную переменную $_return1, также как и некоторые другие "функции" в кликермане. Смотрим в справку  :D.