Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.26;
Скачать: CL | DM;

Вниз

FindWindow   Найти похожие ветки 

 
Ormada ©   (2006-02-09 09:48) [0]

Доб день! Заметил такую странность ф-ия 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));


 
Ormada ©   (2006-02-09 09:49) [1]

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


 
Ormada ©   (2006-02-09 10:16) [2]

даа... как показала практика окно находиться стабильно только через 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; // &#225;&#243;&#244;&#229;&#240; &#228;&#235;&#255; &#232;&#236;&#229;&#237;&#232;
 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);


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


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

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


 
Ormada ©   (2006-02-09 11:24) [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);


 
Rouse_ ©   (2006-02-09 12:54) [5]

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

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 13:56) [6]

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


 
Rouse_ ©   (2006-02-09 14:16) [7]

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



Страницы: 1 вся ветка

Текущий архив: 2006.02.26;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.066 c
2-1139610999
Child
2006-02-11 01:36
2006.02.26
Почему когда вписываю в uses QStdCtrls и QCheckLst, то перестаёт


2-1139210354
BlackCat
2006-02-06 10:19
2006.02.26
fkCalculated


15-1139230393
max999
2006-02-06 15:53
2006.02.26
маленький вопросик С++ ))


3-1135705436
jiny
2005-12-27 20:43
2006.02.26
Линки в поле на другую запись


1-1138140989
Volf_555
2006-01-25 01:16
2006.02.26
Как в TIniFile удалить целый раздел, а не отдельный параметр?