Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2019, 09:26   #11
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
По умолчанию

Тоже задлся этим вопросом. Смотрел в сторону
Код:
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
Иконки дёргаются, видно что происходит обновление, но не того, что нужно.
Shouldercannon вне форума Ответить с цитированием
Старый 29.05.2019, 01:17   #12
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 156
По умолчанию

Кто-то очень не любит искать лёгкие пути?

Код:
 
uses
//...
..., ShDocVw, ShlObj, ActiveX;

 const explorerclass='cabinetwclass';
 
 procedure TMainform.MmakeMeGood(Sender: TObject);
var
  I: Integer;
  h:HWND;
begin
    h := GetWindow(application.handle, gw_hwndfirst);
    while h <> 0 do
     begin
       if (h <> Application.Handle) and isexplorerwind(h)
       and (GetWindow(h, gw_owner) = 0) then refrsh(h);
       h := GetWindow(h, gw_hwndnext);
     end;
end;


function TMainform.isexplorerwind(ahandle: hwnd): boolean;
var buff: array [0..255] of char;
    cl:string;
begin
  getclassname(ahandle,buff,sizeof(buff));
  cl:=strpas(buff);
  cl:=lowercase(cl);
   if pos('cabinetwclass',cl)<>0 then
     result:=true else result:=false;
end;

procedure TMainform.refrsh(const ahandle: hwnd);
 function SuppEx(const Instance: IUnknown; const Intf: TGUID; out Inst): Boolean;
  begin
    Result := (Instance <> nil) and (Succeeded(Instance.QueryInterface(Intf, Inst))) and (Pointer(Inst) <> nil);
  end;
  var
  psw: IShellWindows;
  pdisp: IDispatch;
  X: Integer;
  pwba: IWebBrowserApp;
  psp: IServiceProvider;
  psb: IShellBrowser;
  psv: IShellView;
  pfv: IFolderView;
begin
  if SUCCEEDED(CoCreateInstance(CLASS_ShellWindows, nil, CLSCTX_ALL, IID_IShellWindows, psw)) then
    for X := 0 to psw.Count - 1 do
    begin
      pdisp := psw.Item(X);
      if SuppEx(pdisp, IID_IWebBrowserApp, pwba) and
         (pwba.get_HWND = ahandle) and
         SuppEx(pwba, IServiceProvider, psp) and
         SUCCEEDED(psp.QueryService(SID_STopLevelBrowser, IID_IShellBrowser, psb)) and
         SUCCEEDED(psb.QueryActiveShellView(psv)) and
         SuppEx(psv, IID_IFolderView, pfv) then
         psv.Refresh;
    end;
end;
Писал довольно давно, посему малость г-кода присутствует.
И да, не обновляет рабочий стол, но тут уж как-нибудь сам..

Последний раз редактировалось DIONISKA; 29.05.2019 в 07:07.
DIONISKA вне форума Ответить с цитированием
Старый 31.05.2019, 23:59   #13
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
По умолчанию

В коллекци, чтобы не потерять без реализации обновления работчего стола
Код:
unit frm_Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Win.Registry, Winapi.ShlObj, ShDocVw, Winapi.ActiveX;

const
  explorerclass = 'cabinetwclass';

type
  TFormMain = class(TForm)
    BShow: TButton;
    BHide: TButton;
    procedure BShowClick(Sender: TObject);
    procedure BHideClick(Sender: TObject);
    procedure MmakeMeGood(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormMain: TFormMain;

implementation

{$R *.dfm}

function isexplorerwind(ahandle: hwnd): boolean;
var
  buff: Array [0..255] of Char;
  cl: String;
begin
  getclassname(ahandle, buff, SizeOf(buff));
  cl := strpas(buff);
  cl := lowercase(cl);
  if Pos('cabinetwclass', cl) <> 0 then Result := True else Result := False;
end;

procedure refrsh(const ahandle: HWND);
  function SuppEx(const Instance: IUnknown; const Intf: TGUID; out Inst): Boolean;
  begin
    Result := (Instance <> nil) and (Succeeded(Instance.QueryInterface(Intf, Inst))) and (Pointer(Inst) <> nil);
  end;
var
  psw: IShellWindows;
  pdisp: IDispatch;
  X: Integer;
  pwba: IWebBrowserApp;
  psp: IServiceProvider;
  psb: IShellBrowser;
  psv: IShellView;
  pfv: IFolderView;
begin
  if SUCCEEDED(CoCreateInstance(CLASS_ShellWindows, nil, CLSCTX_ALL, IID_IShellWindows, psw)) then
  for X := 0 to psw.Count - 1 do
  begin
    pdisp := psw.Item(X);
    if SuppEx(pdisp, IID_IWebBrowserApp, pwba) and
      (pwba.get_HWND = ahandle) and
      SuppEx(pwba, IServiceProvider, psp) and
      SUCCEEDED(psp.QueryService(SID_STopLevelBrowser, IID_IShellBrowser, psb)) and
      SUCCEEDED(psb.QueryActiveShellView(psv)) and
      SuppEx(psv, IID_IFolderView, pfv) then
      psv.Refresh;
  end;
end;

procedure TFormMain.MmakeMeGood(Sender: TObject);
var
  h: HWND;
begin
  h := GetWindow(Application.Handle, GW_HWNDFIRST);
  while h <> 0 do
  begin
    if (h <> Application.Handle) and isexplorerwind(h) and (GetWindow(h, GW_OWNER) = 0) then refrsh(h);
    h := GetWindow(h, GW_HWNDNEXT);
  end;
end;

procedure TFormMain.BShowClick(Sender: TObject);
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_CURRENT_USER;
  Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced', True);
  Reg.WriteInteger('Hidden', 1);
  Reg.CloseKey;
  FreeAndNil(Reg);
  MmakeMeGood(Self);
end;

procedure TFormMain.BHideClick(Sender: TObject);
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_CURRENT_USER;
  Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced', True);
  Reg.WriteInteger('Hidden', 2);
  Reg.CloseKey;
  FreeAndNil(Reg);
  MmakeMeGood(Self);
end;

end.
Shouldercannon вне форума Ответить с цитированием
Старый 16.03.2021, 21:31   #14
delphiname
Новичок
Джуниор
 
Регистрация: 16.03.2021
Сообщений: 3
По умолчанию

поднимаю тему =) а как вместе обновить рабочий стол??? если отдельно добавить то папки скрываются отображаются после двух нажатий по кнопке =(

Код:
var h:THandle;
begin
h:=FindWindow('ProgMan', nil);
h:=GetWindow(h, GW_CHILD);
PostMessage(h, WM_KEYDOWN, VK_F5, 0);
delphiname вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Процесс explorer.exe не работает и перегружает ЦП (Windows 7) Npwas Операционные системы общие вопросы 2 19.07.2012 19:43
Интеграция в Windows Explorer Alex217Vish Общие вопросы .NET 2 15.07.2010 19:11
Выделение файлов Windows Explorer Gerzs Общие вопросы Delphi 11 12.10.2009 16:51
Cвой пункты в всплывающем меню Windows Explorer Gerzs Общие вопросы Delphi 12 22.08.2009 19:38
Как отключить WinKey в Windows Explorer? OCTAGRAM Софт 3 29.06.2009 04:51