|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Переименование окон в 1 клик
Добрый день!
Я пока еще почти полный ноль в этой сфере, буду очень признателен если поможете. Итак, суть вопроса: У меня открыто одновременно N-ное количество окон с названием, допустим, "Racing". Что нужно: В событие (клик) для кнопки прописать переименование всех запущенных окон с названием "Racing" в "Racing1", "Racing2", "Racing3" и так далее. Поиском пользовался, в отдельных моментах что-то есть похожее, я пытался редактировать коды / читать документацию, но все безуспешно. Буду очень признателен, если напишите код для выполнения вышеописанной задачи. P.S.: Да, я понимаю... Везде нужно разбираться и изучать мат.часть. Но надеюсь добрые люди найдутся и помогут.. =) P.S.S.: Пока что я научился только переименовывать одно окно по заголовку. Код:
SetWindowText(FindWindow(nil, 'Тут пишу заголовок окна'), 'Тут во что его переименовать'); |
#2
|
||||
|
||||
EnumWindows, в колбеке проверка имени окна и изменение если надо. Подробности использования функции EnumWindows в гугле.
jmp $ ; Happy End! The Cake Is A Lie. |
#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. jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
MIHAHIM (08.11.2015)
|
#14
|
|||
|
|||
Цитата:
Все работает на ура! |