Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.11.2015, 19:42
MIHAHIM MIHAHIM вне форума
Прохожий
 
Регистрация: 06.11.2015
Сообщения: 10
Версия Delphi: RAD STUDIO 10
Репутация: 10
Радость Переименование окон в 1 клик

Добрый день!
Я пока еще почти полный ноль в этой сфере, буду очень признателен если поможете.
Итак, суть вопроса:
У меня открыто одновременно N-ное количество окон с названием, допустим, "Racing".
Что нужно: В событие (клик) для кнопки прописать переименование всех запущенных окон с названием "Racing" в "Racing1", "Racing2", "Racing3" и так далее.
Поиском пользовался, в отдельных моментах что-то есть похожее, я пытался редактировать коды / читать документацию, но все безуспешно.
Буду очень признателен, если напишите код для выполнения вышеописанной задачи.

P.S.: Да, я понимаю... Везде нужно разбираться и изучать мат.часть. Но надеюсь добрые люди найдутся и помогут.. =)

P.S.S.: Пока что я научился только переименовывать одно окно по заголовку.
Код:
SetWindowText(FindWindow(nil, 'Тут пишу заголовок окна'),
'Тут во что его переименовать');
Ответить с цитированием
  #2  
Старый 06.11.2015, 20:39
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

EnumWindows, в колбеке проверка имени окна и изменение если надо. Подробности использования функции EnumWindows в гугле.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #3  
Старый 06.11.2015, 22:07
MIHAHIM MIHAHIM вне форума
Прохожий
 
Регистрация: 06.11.2015
Сообщения: 10
Версия Delphi: RAD STUDIO 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
EnumWindows, в колбеке проверка имени окна и изменение если надо. Подробности использования функции EnumWindows в гугле.
По EnumWindows мало чего нашел, и то, что не нужно
Сможете помочь?
Ответить с цитированием
  #4  
Старый 06.11.2015, 22:48
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,020
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вот пример из одного из моих проектов:
Код:
function AddWindow(AHandle : THandle; ListBox : LPARAM) : BOOL; stdcall;
var
  FWndInfo : TWndInfo;
  AText : String;
  PText : Array [0..1023] Of Char;
begin
  If (AHandle <> Application.Handle) And (AHandle <> Application.MainForm.Handle) And
     (IsWindowVisible(AHandle)) And (GetWindow(AHandle, GW_OWNER) = 0) And (IsWindow(AHandle))
    Then
      Begin
        FillChar(PText,Length(PText) * SizeOf(Char),#0);
        GetWindowText(AHandle,@PText,1023);
        AText := StrPas(PText);
        If (AText <> '') And (AText <> 'Program Manager') Then
          Begin
            FWndInfo := TWndInfo.Create(AHandle,AText);
            TListBox(ListBox).Items.AddObject(AText,FWndInfo);
          End;
      End;
  Result := TRUE;
end;

{ TForm1 }

procedure TMainForm.GetWindowsList;
var
  I : Integer;
begin
  lbWindows.Items.BeginUpdate;
  Try
    // Clear
    For I := 0 To lbWindows.Items.Count-1 Do lbWindows.Items.Objects[i].Free;
    lbWindows.Items.Clear;
    lbWindows.Sorted := False;

    // Get new list
    EnumWindows(@AddWindow,LPARAM(lbWindows));
    If lbWindows.Items.Count > 0 Then lbWindows.ItemIndex := 0;
    lbWindows.Sorted := FPreferences.SortOrder = soAlpha;
  Finally
    lbWindows.Items.EndUpdate;
  End;
end;
Он просто показывает список окон по определенным условиям. Собственно, тебе надо выкинуть работу со списком и с помощью GetWindowText получить заголовок и изменить его вызовом SetWindowText если это правильное окно. счетчик можно сделать глобальным или передавать через второй параметр EnumWindows.

ЗЫ. Кстати, что удивительно, этот код работает прекрасно и в 32 и в 64 битах.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
MIHAHIM (08.11.2015)
  #5  
Старый 06.11.2015, 22:54
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Примерно так:
Код:
...

var
  Form8: TForm8;
  n: Integer;

...

function EnumWindowsProc(wHandle: HWND; Param: Pointer): BOOL; stdcall;
var
  Title, ClassName: array[0..255] of char;
begin
  GetWindowText(wHandle, Title, 255);
  GetClassName(wHandle, ClassName, 255);
  if IsWindowVisible(wHandle) and (ClassName = 'TForm8')
  then begin
       Inc(n);
       SetWindowText(wHandle, Format('Кукарямба %d', [n]));
       end;
  Result := True;
end;

procedure TForm8.Timer1Timer(Sender: TObject);
begin
  n := 0;
  EnumWindows(@EnumWindowsProc, 0);
end;

...
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
MIHAHIM (08.11.2015)
  #6  
Старый 07.11.2015, 15:26
MIHAHIM MIHAHIM вне форума
Прохожий
 
Регистрация: 06.11.2015
Сообщения: 10
Версия Delphi: RAD STUDIO 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Примерно так
Я наверное окончательно отупел... но все же.
Я вставил твой код в код моей кнопки. Поставил таймер.
Код подправил под мои формы.
Общий Код получился вот такой:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);

  private

  public

end;

var
  Form1: TForm1;
  n: Integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
function EnumWindowsProc(wHandle: HWND; Param: Pointer): BOOL; stdcall;
var
  Title, ClassName: array[0..255] of char;
begin
  GetWindowText(wHandle, Title, 255);
  GetClassName(wHandle, ClassName, 255);
  if IsWindowVisible(wHandle) and (ClassName = 'TForm8')
  then begin
       Inc(n);
       SetWindowText(wHandle, Format('Кукарямба %d', [n]));
       end;
  Result := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
 begin
  n := 0;
  EnumWindows(@EnumWindowsProc, 0);
 end;
Возникает такая ошибка:
Expected BEGIN but received the eng of line 49:1
___________
Как быть ?
Ответить с цитированием
  #7  
Старый 07.11.2015, 17:34
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Так вы зачем в обработчик события описание внешней функции впиндюрили?
Код:
function EnumWindowsProc(wHandle: HWND; Param: Pointer): BOOL; stdcall;
это надо до раздела implementation размещать.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
MIHAHIM (08.11.2015)
  #8  
Старый 07.11.2015, 18:58
MIHAHIM MIHAHIM вне форума
Прохожий
 
Регистрация: 06.11.2015
Сообщения: 10
Версия Delphi: RAD STUDIO 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Так вы зачем в обработчик события описание внешней функции впиндюрили?
Код:
function EnumWindowsProc(wHandle: HWND; Param: Pointer): BOOL; stdcall;
это надо до раздела implementation размещать.
Поместил в Private
Код:
function EnumWindowsProc(wHandle: HWND; Param: Pointer): BOOL; stdcall;
Теперь вот такие ошибки:
Ответить с цитированием
  #9  
Старый 07.11.2015, 19:03
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

надо было в вашем коде просто переставить местами строки 30 и 31.
Ответить с цитированием
  #10  
Старый 07.11.2015, 20:15
MIHAHIM MIHAHIM вне форума
Прохожий
 
Регистрация: 06.11.2015
Сообщения: 10
Версия Delphi: RAD STUDIO 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от icWasya
надо было в вашем коде просто переставить местами строки 30 и 31.
Я уже все перепробовал. Все равно эти ошибки... (

Люди добрые, помогите
Ответить с цитированием
  #11  
Старый 07.11.2015, 23:24
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,020
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Код просто поправил, логику не проверял:
Код:
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
  public
end;
 
var
  Form1: TForm1;
  n: Integer;
 
implementation
 
{$R *.dfm}

function EnumWindowsProc(wHandle: HWND; Param: Pointer): BOOL; stdcall;
var
  Title, ClassName: array[0..255] of char;
begin
  GetWindowText(wHandle, Title, 255);
  GetClassName(wHandle, ClassName, 255);
  if IsWindowVisible(wHandle) and (ClassName = 'TForm8')
  then begin
       Inc(n);
       SetWindowText(wHandle, Format('Кукарямба %d', [n]));
       end;
  Result := True;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  n := 0;
  EnumWindows(@EnumWindowsProc, 0);
end;

end.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
MIHAHIM (08.11.2015)
  #12  
Старый 08.11.2015, 00:22
MIHAHIM MIHAHIM вне форума
Прохожий
 
Регистрация: 06.11.2015
Сообщения: 10
Версия Delphi: RAD STUDIO 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Код просто поправил, логику не проверял:
Такс, у меня уже что-то начало работать. Я безумно рад
Но, к сожалению, не совсем так, как задумывалось... )
Вот такой рабочий код у меня сейчас (без ошибок при сборке):
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
  private
  public
end;

var
  Form1: TForm1;
  n: Integer;

implementation

{$R *.dfm}

function EnumWindowsProc(wHandle: HWND; Param: Pointer): BOOL; stdcall;
var
  Title, ClassName: array[0..255] of char;
begin
  GetWindowText(wHandle, Title, 255);
  GetClassName(wHandle, ClassName, 255);
  if findwindow(nil, 'Racing') <>0
  then begin
       Inc(n);
       SetWindowText(wHandle, Format('Racing %d', [n]));
       end;
  Result := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  n := 0;
  EnumWindows(@EnumWindowsProc, 0);
end;

end.
Итак, при нажатии на кнопку, окна с указанным названием действительно переименовываются. Но почему то им присваивается абсолютно случайные двухзначные номера. А так же свой заголовок меняет и сама моя программа.
Как я писал в первом посте мне нужна нумерация по порядку, начиная с 1, 2, 3, итд.
Ну, естественно переименование окна моей проги тоже не нужно )
Буду рад если поможете завершить мою простенькую программу
P.S.: Уже высказываю благодарность Страдальцу и lmikle за активную помощь
Ответить с цитированием
  #13  
Старый 08.11.2015, 00:32
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Зачем было менять почти рабочую часть на эту чушь?
Цитата:
if findwindow(nil, 'Racing') <> 0 then
Достаточно было поменять "ClassName = 'TForm8'" на "Title = 'МоёСуперОкноКотороеНадоПоменять'" и всё.
А вообще, прежде, чем копировать случайные куски кода с разных форумов и вставлять их в случайным образом выбранные места в коде, стоило разобраться хотя бы в общих чертах, что такое программирование и что такое код на Delphi.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
MIHAHIM (08.11.2015)
  #14  
Старый 08.11.2015, 06:57
MIHAHIM MIHAHIM вне форума
Прохожий
 
Регистрация: 06.11.2015
Сообщения: 10
Версия Delphi: RAD STUDIO 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Зачем было менять почти рабочую часть на эту чушь?

Достаточно было поменять "ClassName = 'TForm8'" на "Title = 'МоёСуперОкноКотороеНадоПоменять'" и всё.
А вообще, прежде, чем копировать случайные куски кода с разных форумов и вставлять их в случайным образом выбранные места в коде, стоило разобраться хотя бы в общих чертах, что такое программирование и что такое код на Delphi.
Спасибо Вам и всем кто помогал мне
Все работает на ура!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:05.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter