あるフォルダをエクスプローラで起動するには、
ShellExecute(Handle, nil, PChar('C:\Temp'), nil, nil, SW_SHOW);
などでできますが、既に起動しているエクスプローラのフォルダを変更することは可能でしょうか?
例えば、現在 C:\ が選択されている状態とすると、これを C:\Temp が
選択されているように変更したいのです。
なお、エクスプローラは1つだけ起動しているものとします。
クラス名とか調べるの面倒だから
とりあえず
C:\ から D:\ に変更
procedure TForm1.Button1Click(Sender: TObject);
var
OwnerHandle,I1,I2,J1,J2: HWND;
Buffer: array[0..255] of Char;
Input : array[0..0] of TInput;
procedure KeybdInput(VK:Byte;dwFlags:DWORD);
begin
with Input[0] do
begin
Itype := INPUT_KEYBOARD;
ki.wVk := VK;
ki.wScan := MapVirtualKey(VK,0);
ki.dwFlags := KEYEVENTF_EXTENDEDKEY or dwFlags;
ki.time := 0;
ki.dwExtraInfo := GetMessageExtraInfo;
end;
end;
function Find(Index: Integer; OwnerHandle: HWND): Boolean;
var
A1,A2: Integer;
begin
A1 := 0;
A2 := 1;
while A2 <> 0 do
begin
A2 := FindWindowEx (OwnerHandle , A1 ,nil,nil);
if A2 <> 0 then
begin
SendMessage (A2,WM_GETTEXT,SizeOf(Buffer),Integer(@Buffer));
if StrPas(Buffer) = 'C:\' then
begin
StrPCopy(Buffer,'D:\');
SendMessage (A2,WM_SETFOCUS,0,0);
SendMessage (A2,WM_SETTEXT,0,Integer(@Buffer));
KeybdInput (13,0);
Windows.SendInput (1,Input[0],SizeOf(Input[0]));
end;
Find(Index+1,A2);
end
else
begin
end;
A1 := A2;
end;
end;
begin
ShellExecute(Handle, nil, PChar('C:\'), nil, nil, SW_SHOW);
Sleep(3000);
OwnerHandle := FindWindow (nil,'WindowsXP 80GB (C:)'); //適当に
if OwnerHandle <> 0 then
begin
I1 := 0;
I2 := 1;
while I2 <> 0 do
begin
I2 := FindWindowEx (OwnerHandle, I1 ,nil,nil);
if I2 <> 0 then
begin
Buffer := 'AAAA2222';
SendMessage (I2,WM_SETTEXT,Integer(@Buffer),0);
Memo1.Lines.Add ('#1');
Find(2,OwnerHandle);
end
else
begin
end;
I1 := I2;
end;
end
else
begin
end;
end;
>Buffer := 'AAAA2222';
>SendMessage (I2,WM_SETTEXT,Integer(@Buffer),0);
>Memo1.Lines.Add ('#1');
気にしないように
IE上の ComboBox のハンドルを取得して
//フォーカスを当てる
SendMessage (A2,WM_SETFOCUS,0,0);
//テキストを代える
SendMessage (A2,WM_SETTEXT,0,Integer(@Buffer));
//RETRUN (ENTER) を押す
KeybdInput (13,0);
Windows.SendInput (1,Input[0],SizeOf(Input[0]));
KHE00221さん、ありがとうございます。
なかなかコードは理解できないのですが、
動作はばっちりでした。
これからじっくりコードを調べさせて貰います。
これでOK
ShellExecute(Handle, nil, PChar('C:\'), nil, nil, SW_SHOW);
Sleep(3000);
OwnerHandle := FindWindow (nil,'WindowsXP 80GB (C:)'); //適当に
if OwnerHandle <> 0 then
begin
Find (2,OwnerHandle);
end;
Find の Index は階層見るためにつけてただけでいらない
//SendMessage (A2,WM_GETTEXT,SizeOf(Buffer),Integer(@Buffer));
//if StrPas(Buffer) = 'C:\' then
を
GetClassName(A2,Buffer,SizeOf(Buffer));
if StrPas(Buffer) = 'ComboBoxEx32' then
に変更
なんどのあれですが
これでOKかな
function Find(OwnerHandle: HWND): Boolean;
var
A1,A2: Integer;
begin
A1 := 0;
A2 := 1;
while A2 <> 0 do
begin
A2 := FindWindowEx (OwnerHandle , A1 ,nil,nil);
if OwnerHandle = 0 then //Top の Class名を保存しておく
begin
GetClassName(A2,Buffer,SizeOf(Buffer));
OwnerWindowClassName := StrPas(Buffer);
end;
if A2 <> 0 then
begin
GetClassName(A2,Buffer,SizeOf(Buffer));
if StrPas(Buffer) = 'ComboBoxEx32' then
begin
if OwnerWindowClassName = 'CabinetWClass' then // IE の クラス名
begin
StrPCopy(Buffer,'D:\');
SendMessage (A2,WM_SETFOCUS,0,0);
SendMessage (A2,WM_SETTEXT,0,Integer(@Buffer));
KeybdInput (13,0);
Windows.SendInput (1,Input[0],SizeOf(Input[0]));
Memo1.Lines.Add ('#');
end;
end;
Find(A2);
end
else
begin
end;
A1 := A2;
end;
end;
begin
ShellExecute(Handle, nil, PChar('C:\'), nil, nil, SW_SHOW);
Sleep(3000);
Find (0);
みなさん,こんにちは.Mr.XRAYです.
以前TShellコンポーネントを使用したサンプルを作成したことがあります.
これを使用したテストをしてみました.
こんなやり方もあるという参考になれば,
06_TShellWindows 表示中のエクスプローラを操作
http://mrxray.on.coocan.jp/Delphi/plSamples/945_ExplorerTest.htm#06
KHE00221さん、Mr.XRAYさん、ありがとうございます。
解決を押していたので、見落とすところでした(^^;
お二方のコードで、したいことがばっちり出来ました。
ただ、理解はなかなかできていません・・・
難しいというか、知識が無いと、雰囲気くらいしか
分からないのが情けないところです・・・
丁度、エクスプローラで選択しているファイルのパスを
取得して、そのファイルに対して色々操作を行いたいと
調べ物をしていた最中でしたので、とても助かりました。
コードでは1ファイルのみを対象にされていましたので、
複数ファイル用に以下のように変更してみました。
ありがとうございました。
if SHFolderView.SelectedItems.Count >0 then begin
for iw := 0 to Pred(SHFolderView.SelectedItems.Count) do begin
Memo1.Lines.Add(SHFolderView.SelectedItems.Item(iw).Path);
end;
end;
ツイート | ![]() |