![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
Цитата:
Все работает на ура! |