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

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

FindWindow [D7, WinXP]


Ormada ©   (2006-02-09 09:48:00) 

Доб день! Заметил такую странность ф-ия FindWindow не всегда находит окно. Когда запускаю это в первый раз TargetWindowHWND=0(не нашлось) во второй раз если пердыдущее окно открыто то всё ок.
Не пойму с чем это связанно....

uses
 Windows, ShellApi, SysUtils, Messages,Dialogs;
const
 EXPLORER_CLASS_NAME                   = 'ExploreWClass';

var
 TargetFolder                          : string;
 TargetWindowHWND                      : HWND;
begin
 TargetFolder := 'c:\';

 ShellExecute(0, 'explore', PAnsiChar(TargetFolder), nil, nil, SW_SHOW);

 TargetWindowHWND := FindWindow(EXPLORER_CLASS_NAME, PAnsiChar(TargetFolder));
 if TargetWindowHWND<>0 then Showmessage(IntToStr(TargetWindowHWND));


Rouse_   (2006-02-09 14:16:00) [1]

А что по твоемому есть "обычный проводник"?


Ormada   (2006-02-09 13:56:00) [2]

ничё не понял при чём тут IWebBrowserApp
открывается обычный ПРОВОДНИК!


Rouse_   (2006-02-09 12:54:00) [3]

Открытая папка известна? Тогда это делается так:

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Button1: TButton;
   Edit1: TEdit;
   procedure Button1Click(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

 function ParceURLName(const Value: String): String;
 const
   scFilePath: array [0..7] of Char = ('f', 'i', 'l', 'e', ':', '/', '/', '/');
 begin
   if CompareMem(@scFilePath[0], @Value[1], 8) then
   begin
     Result := Copy(Value, 9, Length(Value));
     Result := StringReplace(Result, '/', '\', [rfReplaceAll]);
     Result := StringReplace(Result, '%20', ' ', [rfReplaceAll]);
   end
   else
     Result := Value;
 end;

var
iShellWindow: IShellWindows;
iWB: IWebBrowserApp;
spDisp: IDispatch;
I: Integer;
S: String;
begin
 iShellWindow := CoShellWindows.Create;
 for I := 0 to iShellWindow.Count - 1 do
 begin
   spDisp := iShellWindow.Item(I);
   if spDisp = nil then Continue;
   spDisp.QueryInterface(IWebBrowserApp, iWB);
   if iWB <> nil then
   begin
     S := ParceURLName(iWB.LocationURL);
     if S = Edit1.Text then
     ShowMessage('Окно найдено, хэндл окна: ' + IntToStr(iWB.HWND));
   end;
 end;
end;

end.


Ormada   (2006-02-09 11:24:00) [4]

чё-то не догоняю даже через EnumWndProc не всегда находиться окно
код

var
 TargetFolder                          : string;
 FoundWnd                              : HWND;
 ModuleName                            : string;
 FoundModuleName                       : array[0..255] of Char;

function EnumWndProc(hwnd: THandle; Param: Cardinal): Bool; stdcall;
var
 ClassName, WinModuleName              : string;
 WinInstance                           : THandle;

 Nm                                    : array[0..255] of Char;
 WindowText                            : string;
begin
 Result := True;

 SetLength(ClassName, 100);
 GetClassName(hwnd, PChar(ClassName), Length(ClassName));
 ClassName := PChar(ClassName);

 if ClassName = EXPLORER_CLASS_NAME then
 begin
   WinInstance := GetWindowLong(hwnd, GWL_HINSTANCE);

   GetWindowText(hwnd, Nm, 255);
   WindowText := AnsiUpperCase(string(Nm));

   if WindowText = AnsiUpperCase(ModuleName) then
   begin
     FoundWnd := Hwnd;
     Result := False; // stop enumeration
   end;
 end;
end;

begin
 TargetFolder := 'c:\';

 ShellExecute(0, 'explore', PAnsiChar(TargetFolder), nil, nil, SW_SHOWNORMAL);
 ModuleName := TargetFolder;

 EnumWindows(@EnumWndProc, 0);

 TargetWindowHWND:=FoundWnd ;
 if MoveWindow(TargetWindowHWND,200, 150, 175, 300, True) then
   sleep(2000);


Чапаев   (2006-02-09 11:06:00) [5]


> но только почему то не закрывается

Есть такая особенность у Эксплорера... Сам над ней немало помучался. В итоге DestroyWindow() спасло.


Ormada   (2006-02-09 10:16:00) [6]

даа... как показала практика окно находиться стабильно только через EnumWindows

но только почему то не закрывается
пробовал так

PostMessage(TargetWindowHWND, WM_CLOSE, 0, 0);
CloseWindow(TargetWindowHWND);
SendMessage(TargetWindowHWND,WM_SYSCOMMAND,SC_CLOSE,0);

не помогло

function EnumWndProc(hwnd: THandle;
 Param: Cardinal): Bool; stdcall;
var
 ClassName, WinModuleName              : string;
 WinInstance                           : THandle;

 Nm                                    : array[0..255] of Char; // áóôåð äëÿ èìåíè
 WindowText                            : string;
begin
 Result := True;
 SetLength(ClassName, 100);
 GetClassName(hwnd, PChar(ClassName), Length(ClassName));
 ClassName := PChar(ClassName);
 if ClassName = EXPLORER_CLASS_NAME then
 begin
   WinInstance := GetWindowLong(hwnd, GWL_HINSTANCE);

   GetWindowText(hwnd, Nm, 255);
   WindowText := AnsiUpperCase(string(Nm));

   if WindowText = AnsiUpperCase(ModuleName) then
   begin
     FoundWnd := Hwnd;
     Result := False; // stop enumeration
   end;
 end;
end;



begin
 TargetFolder := 'c:\';
 DestinationFolder := 'd:\';

 ShellExecute(0, 'explore', PAnsiChar(TargetFolder), nil, nil, SW_SHOW);
 ModuleName := TargetFolder;

 EnumWindows(@EnumWndProc, 0);

 // TargetWindowHWND := FindWindow(EXPLORER_CLASS_NAME, PAnsiChar(TargetFolder));
 if TargetWindowHWND 0 then Showmessage(IntToStr(TargetWindowHWND));
 //  if MoveWindow(TargetWindowHWND,50,50,500,500,true) then
 sleep(2000);
 CloseWindow(TargetWindowHWND);


Ormada   (2006-02-09 09:49:00) [7]

или лучше искать через EnumWindows


Наверх

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