![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Добрый день! 
		
	
		
		
		
		
		
	
		
		
	
	
	Я пока еще почти полный ноль в этой сфере, буду очень признателен если поможете. Итак, суть вопроса: У меня открыто одновременно N-ное количество окон с названием, допустим, "Racing". Что нужно: В событие (клик) для кнопки прописать переименование всех запущенных окон с названием "Racing" в "Racing1", "Racing2", "Racing3" и так далее. Поиском пользовался, в отдельных моментах что-то есть похожее, я пытался редактировать коды / читать документацию, но все безуспешно.   Буду очень признателен, если напишите код для выполнения вышеописанной задачи. ![]() P.S.: Да, я понимаю... Везде нужно разбираться и изучать мат.часть. Но надеюсь добрые люди найдутся и помогут.. =) P.S.S.: Пока что я научился только переименовывать одно окно по заголовку. Код: 
	SetWindowText(FindWindow(nil, 'Тут пишу заголовок окна'), 'Тут во что его переименовать');  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 EnumWindows, в колбеке проверка имени окна и изменение если надо. Подробности использования функции EnumWindows в гугле. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
   Сможете помочь?  | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Вот пример из одного из моих проектов: 
		
	
		
		
		
		
		
	
		
		
	
	
	Код: 
	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;ЗЫ. Кстати, что удивительно, этот код работает прекрасно и в 32 и в 64 битах.  | 
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
 
MIHAHIM (08.11.2015)
  | ||
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Примерно так: 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Код: 
	...
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  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 Я вставил твой код в код моей кнопки. Поставил таймер. Код подправил под мои формы. Общий Код получился вот такой: Код: 
	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  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Так вы зачем в обработчик события описание внешней функции впиндюрили? 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Код: 
	function EnumWindowsProc(wHandle: HWND; Param: Pointer): BOOL; stdcall;  | 
| Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
 
MIHAHIM (08.11.2015)
  | ||
| 
		 
			 
			#8  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 Код: 
	function EnumWindowsProc(wHandle: HWND; Param: Pointer): BOOL; stdcall; ![]()  | 
| 
		 
			 
			#9  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 надо было в вашем коде просто переставить местами строки 30 и 31. 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#10  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 Люди добрые, помогите ![]()  | 
| 
		 
			 
			#11  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Код просто поправил, логику не проверял: 
		
	
		
		
		
		
		
	
		
		
	
	
	Код: 
	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  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
   Но, к сожалению, не совсем так, как задумывалось... ) Вот такой рабочий код у меня сейчас (без ошибок при сборке): Код: 
	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  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Зачем было менять почти рабочую часть на эту чушь? 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Цитата: 
	
 А вообще, прежде, чем копировать случайные куски кода с разных форумов и вставлять их в случайным образом выбранные места в коде, стоило разобраться хотя бы в общих чертах, что такое программирование и что такое код на Delphi.  | 
| Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
 
MIHAHIM (08.11.2015)
  | ||
| 
		 
			 
			#14  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
   Все работает на ура!  |