Главная страница
    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
6-1132249033
zjuka
2005-11-17 20:37
2006.02.26
Менять прокси через дельфи


2-1139412356
ListBox
2006-02-08 18:25
2006.02.26
Как узнать сколько строк помещается в ListBox без прокрутки?


2-1139154304
parovoZZ
2006-02-05 18:45
2006.02.26
Ошибка при добавлении записи


8-1127121475
NightLord
2005-09-19 13:17
2006.02.26
Графические форматы


2-1139394396
webpauk
2006-02-08 13:26
2006.02.26
Z order





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский