Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.042 c
2-1139291799
MM
2006-02-07 08:56
2006.02.26
Прога в трее


15-1137842282
Nic
2006-01-21 14:18
2006.02.26
Сдал сессию :)


2-1139309466
anonymous-
2006-02-07 13:51
2006.02.26
shelllistview без zip папок


2-1139422708
serko
2006-02-08 21:18
2006.02.26
Socket


2-1139763714
Proxytel
2006-02-12 20:01
2006.02.26
Как организовать (настроить) OpenDialog для выбора директории?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский