![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как послать 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