امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
گرفتن ادرس پوشه جاری در Explorer.exe
نویسنده پیام
lord_viper غایب
مدیر کل انجمن
*****

ارسال‌ها: 3,949
موضوع‌ها: 352
تاریخ عضویت: بهمن ۱۳۸۴

تشکرها : 5193
( 9875 تشکر در 2650 ارسال )
ارسال: #1
گرفتن ادرس پوشه جاری در Explorer.exe
با سلام

گاهی اوقات در برنامه ها نیاز به این پیدا میکنیم که بدونیم الان کاربر در چه پوشه ای قرار داره بعنی ادرس پوشه ای که الان در windows Explorer توسط کاربر در حال مشاهده هست چه ادرسی هست این ادرس چه در برنامه های امنیتی مثل انتی ویروسها و چه ضد امنیتی مثل ویروسها کاربرد داره
3نمونه از این کد

خواندن ادرس از ExplorerBar

کد:
procedure TForm1.Button1Click(Sender: TObject);
Var
Adwnd:hwnd;
Len:integer;
text:string;
begin
Adwnd:=FindWindow('CabinetWClass',nil);
Adwnd:=FindWindowEx(Adwnd,0,'WorkerW',nil);
Adwnd:=FindWindowEx(Adwnd,0,'ReBarWindow32',nil);
Adwnd:=FindWindowEx(Adwnd,0,'ComboBoxEx32',nil);
Adwnd:=FindWindowEx(Adwnd,0,'ComboBox',nil);
Adwnd:=FindWindowEx(Adwnd,0,'Edit',nil);
Len := SendMessage(Adwnd,$000E,0,0);
SetLength(Text,Len);
SendMessage(Adwnd,$000D,Len+1,LongInt(@Text[1]));
ShowMessage(text);
end;

بدست اوردن ادرس جاری با استفاده از shell.application
کد:
procedure TForm1.Button4Click(Sender: TObject);
const
SID_IShellFolderView = '{31C147B6-0ADE-4A3C-B514-DDF932EF6D17}';
var
Shell, Win, Doc: OleVariant;
i:Integer;
begin

Shell := CreateOleObject('Shell.Application');

for i := 0 to Shell.Windows.Count - 1 do
begin
Win := Shell.Windows.Item(i);
Doc := Win.Document;
if Supports(Doc, StringToGUID(SID_IShellFolderView)) then
begin
ShowMessage('Path='+Doc.Folder.Items.Item.Path);
end;

استفاده از IDispatch و shell32 برای بدست اوردن ادرس جاری

کد:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,JwaShLWAPI,JwaShlObj,JwaShlDisp,ActiveX,SHDocVw, StdCtrls,
  ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
  TMChar = array[0..MAX_PATH] of Char;
var
  Form1: TForm1;

implementation

{$R *.dfm}
function GetCurrentPath : TMChar;
var
hwndFind : HWND;
psw : IShellWindows;
pdisp : IDispatch;
X : Integer;
pwba : IWebBrowserApp;
psp : IServiceProvider;
psb : IShellBrowser;
psv : IShellView;
pfv : IFolderView;
ppf2 : IPersistFolder2;
pidlFolder : PItemIDList;
begin
hwndFind := GetForegroundWindow;
Result[0] := #0;
if SUCCEEDED(CoCreateInstance(CLASS_ShellWindows, nil, CLSCTX_ALL, IID_IShellWindows, psw)) then
  begin
   try
    for X := 0 to psw.Count-1 do
     begin
      pdisp := psw.Item(X);
       try
        if SUCCEEDED(pdisp.QueryInterface(IID_IWebBrowserApp, pwba)) then
         try
          if pwba.get_HWND = hwndFind then
           begin
            if SUCCEEDED(pwba.QueryInterface(IServiceProvider, psp)) then
             try
              if SUCCEEDED(psp.QueryService(SID_STopLevelBrowser, IID_IShellBrowser, psb)) then
               try
                if SUCCEEDED(psb.QueryActiveShellView(psv)) then
                 try
                  if SUCCEEDED(psv.QueryInterface(IID_IFolderView, pfv)) then
                   try
                    if SUCCEEDED(pfv.GetFolder(IPersistFolder2, ppf2)) then
                     try
                      if SUCCEEDED(ppf2.GetCurFolder(pidlFolder)) then
                       try
                        if not SHGetPathFromIDList(pidlFolder, Result) then
                         StrCopy(Result, '<?? ???????>');
                       finally
                       CoTaskMemFree(pidlFolder);
                       end;
                     finally
                      ppf2 := nil;
                     end;
                   finally
                    pfv := nil;
                   end;
                 finally
                  psv := nil;
                 end;
               finally
                psb := nil;
               end;
             finally
              psp := nil;
             end;
            Break;
           end;
         finally
          pwba := nil;
         end;
       finally
        pdisp := nil;
       end;
     end;
   finally
    psw := nil;
   end;
  end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
  path:tmchar;
begin
  path:= GetCurrentPath;
Caption:=string(path);
end;
end.
یونیتهای JwaShLWAPI,JwaShlObj,JwaShlDisp مربوط به مجموعه JVCL میباشد که میتوانید از سایت ان دریافت کنید

کد:
http://sourceforge.net/projects/jvcl/files/

[تصویر:  xshon.png]
از آن نماز که خود هیچ از آن نمی فهمی خدا چه فایده و بهره اکتساب کند
تفاخری نبود مر خدای عالم را که چون تو ابلهی او را خدا حساب کند
۱۵-فروردین-۱۳۹۰, ۱۰:۴۳:۴۹
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : hamedalto


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  عکس گرفتن از کامپوننت ScrollBox برنامه Lazarus Majid_Ebru 0 1,878 ۲۶-اردیبهشت-۱۳۹۵, ۱۷:۴۷:۵۱
آخرین ارسال: Majid_Ebru
  گرفتن سریال فیزیکی هارد lord_viper 0 2,134 ۰۴-اردیبهشت-۱۳۹۲, ۰۹:۰۱:۰۴
آخرین ارسال: lord_viper
Question تغییر دادن مسیر پوشه!؟؟؟؟ The.Ghost 9 6,830 ۲۱-فروردین-۱۳۹۲, ۱۰:۰۵:۳۰
آخرین ارسال: lord_viper
  گرفتن لیست پروسه ها از طریق WMI lord_viper 0 2,129 ۱۷-آبان-۱۳۹۱, ۱۱:۵۱:۳۱
آخرین ارسال: lord_viper
  ادرس فایل lord_viper 6 3,920 ۱۶-مرداد-۱۳۸۶, ۱۰:۴۷:۰۴
آخرین ارسال: veyskarami

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 1 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS