Как заставить TC перечитать панель?
Select messages from
# through # FAQ
[/[Print]\]

Total Commander -> Написание плагинов для Total Commander

#1: Как заставить TC перечитать панель? Author: Alextp PostPosted: Sat Oct 08, 2005 19:20
    —
Hello,

Написал FS-плагин. Проблема: хочу чтобы при выборе псевдо-файла "Перечитать панель" панель плагина перечитывалась. Как это организовать, в какой функции?

#2:  Author: botaceLocation: Moscow PostPosted: Sat Oct 08, 2005 22:38
    —
Пошли окну коммандера cm_RereadSource

#3:  Author: Alextp PostPosted: Sun Oct 09, 2005 00:19
    —
2botace
А это будет работать, если запущено несколько копий коммандера?
Как из нескольких окон узнать окно с плагином?

#4:  Author: botaceLocation: Moscow PostPosted: Sun Oct 09, 2005 01:00
    —
Неа, в FsInit например сразу ищи для своего процесса:
Code:

struct EnumWindowsParam {
   DWORD   dwPID;
   HWND hFoundWnd;
};

BOOL CALLBACK EnumWindowsProc( HWND hWnd, LPARAM l)
{
   EnumWindowsParam* pParam = ( EnumWindowsParam*)l;
   DWORD dwPID = 0;
   ::GetWindowThreadProcessId( hWnd, &dwPID);
   if( pParam->dwPID == dwPID)
   {
      std::vector< char > vClass( 128, 0);
      if( ::GetClassName( hWnd, &vClass[ 0], (int)vClass.size()) && !stricmp( &vClass[ 0], "TTOTAL_CMD"))
      {
         pParam->hFoundWnd = hWnd;
         return FALSE;
      }
   }
   return TRUE;
}
...
...
EnumWindowsParam param = { GetCurrentProcessId(), NULL };
::EnumWindows( EnumWindowsProc, LPARAM( &param));
if( ::IsWindow( param.hFoundWnd))
{
    ...
}

Мона и более грубым и менее совместимым по виндам способом. Но, это если захочешь Smile

#5:  Author: Alextp PostPosted: Mon Oct 10, 2005 19:20
    —
Догадался, как сделать проще всего. Handle окна передается плагину в FsExecuteFile (пар. MainWin), так что просто вызываем RereadPanel с этим хендлом:

Code:
procedure RereadPanel(hWnd: THandle);
const
  EM_DISPLAYBAND = WM_USER+51;
  cm_RereadSource = 540;
begin
  Sleep(200);
  SendMessage(hWnd, EM_DISPLAYBAND, cm_RereadSource, 0);
  Sleep(200);
end;


2botace
Спасибо за подсказку! Да, твой код на Дельфи:
Code:
type
  TEnumWindowsParam = record
    dwPID: DWORD;
    hFoundWnd: HWND;
  end;
  PEnumWindowsParam = ^TEnumWindowsParam;

function EnumWindowsProc(hWnd: THandle; l: LPARAM): BOOL; stdcall;
var
  pParam: PEnumWindowsParam;
  dwPID: DWORD;
  buf: array[0..200] of char;
begin
  pParam:= PEnumWindowsParam(l);
  dwPID:= 0;
  GetWindowThreadProcessId(hWnd, @dwPID);
  if pParam^.dwPID=dwPID then
   if (GetClassName(hWnd, buf, SizeOf(buf))>0) and (buf='TTOTAL_CMD') then
    begin
    pParam^.hFoundWnd:= hWnd;
    Result:= false;
    end;
  Result:= true;
end;

function GetTCHWnd: THandle;
var
  param: TEnumWindowsParam;
begin
  param.dwPID:= GetCurrentProcessId;
  param.hFoundWnd:= 0;
  EnumWindows(@EnumWindowsProc, LPARAM(@param));
  if IsWindow(param.hFoundWnd)
    then Result:= param.hFoundWnd else Result:= 0;
end;



Total Commander -> Написание плагинов для Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Page 1 of 1

Powered by phpBB © 2001, 2005 phpBB Group