Форум: "Начинающим";
Текущий архив: 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; // áóôåð äëÿ èìåíè
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