Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как послать WM_SYSCOMMAND,SC_RESTORE окну, которое


Long ©   (2004-06-01 17:15:00) 

сидит в панели задач?
Ну, например, ловя его за Caption?
За примерчик буду очень признателен.


Игорь Шевченко   (2004-06-02 00:43:00) [1]

Long   (01.06.04 19:16)

EnumWindows почитай


Long   (2004-06-01 19:16:00) [2]

Не выходит, все равно.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 h,k,b:Hwnd;
implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var h,b:Hwnd;
begin

h:=handle;
while h > 0 do begin
if isWindowVisible(h) then
postmessage(h,WM_SYSCOMMAND,SC_MINIMIZE,0);
h:=getnextwindow(h,GW_HWNDNEXT);
              end;

b := FindWindow(nil, 'Конкретный Caption');
if IsWindow(b) then
postmessage(b,WM_SYSCOMMAND, SC_RESTORE,0);
end;
end.

Простите меня друзья, спасибо за вашу помощь, но я так и не врубился.
Делаю вот то, что выше. Окна благополучно закрываются, а "Конкретный Caption"
не открывается. Прмо хоть стреляйся :-(


WebErr   (2004-06-01 17:55:00) [3]


> Long   (01.06.04 17:41) [3]

Лучше пробегать по окнам и сворачивать либо раскрывать конкретные окна, тогда не будет проблем типа туда-сюда и мелькания на экране, хотя для визуального эффекта... такой подход имеет место быть!


WebErr   (2004-06-01 17:52:00) [4]

Пусть окно имеет класс const MyClassName = 'TMyClassName';
Далее:

procedure SetNormalMyWnd;
var
 MyWnd: HWND;
 S: PChar;
begin
 try
   GetMem(S, 256);
 except
   ShowMessage('Sorry!');
   Exit;
 end;
 MyWnd := FindWindow(0, 0);
 while MyWnd <> 0 do
 begin
   MyWnd := GetNextWindow(MyWnd, GW_HWNDNEXT);
   GetClassName(S, 255);
   if StrComp(S, MyClassName) = 0 then
   begin
     SendMessage(MyWnd, WM_SYSCOMMAND, SC_RESTORE, 0);
     Break;
   end;
 end;
 FreeMem(S);
end;

В коде могут быть ошибки - писал на ходу. :)


Игорь Шевченко   (2004-06-01 17:44:00) [5]


function RestoreWindow (const ACaption: string);
var
 Wnd: HWND;
 Dummy: DWORD;
begin
 Wnd := FindWindow(nil, PChar(ACaption));
 if IsWindow(Wnd) then
   SendMessageTimeout(Wnd, WM_SYSCOMMAND, SC_RESTORE, 0,
     SMTO_ABORTIFHUNG, 2000, Dummy);
end;


Long   (2004-06-01 17:41:00) [6]

Если подробнее, то это проблеиа свернуть все окна,
а потом открыть конкретное.
Свернуть легко.
А вот, развернуть нужное?
В faq я искал и не нашел.


Long   (2004-06-01 17:30:00) [7]

Спасибо, Игорь.
Теория мне известна. А вот практика - увы.
Если не трудно, хотя бы маленький пример.
Не подумайте, что я халявщик и сам думать не хочу.
Сегодня целый день бился с этими HWND.
И ничего не получается :-(


Игорь Шевченко   (2004-06-01 17:23:00) [8]

FindWindow + SendMessageTimeout


Наверх

Титульная страница Поиск, карта сайта Написать письмо