Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: Запрет запуска двух копий wlx 
Author Message
SCHMaster



PostPosted: Thu Feb 03, 2005 15:22    Post subject: Reply with quote

Nik
Quote:
Тут есть пара проблем: с одной стороны я использую не станадартный компонент (который, в принципе можно заменить); с другой - на чистом WinApi я до сих пор не писал, так что любой помощи буду рад...
В принципе пример того, как работает AmpView можно глянуть в исходниках AmpView Classic (они выложены на wincmd.ru).

Компоненты тут непричем. А помощь - невопрос. Что непонятно - свисти.

Code:
// Cтруктура отображенного в память файла - как создать и юзать
набери в поисковике - CreateFileMapping и MapViewOfFile
  PMainData = ^TMainData;
  TMainData = record
  MainForm:HWND;
  ....
  ....
end;

...
var
DMainData:PMainData; // Глобальная (!!!!) переменная
wc : TWndClass;
I:Integer = 0

function ListLoad(ParentWin: HWND;  FileToLoad: pchar;  ShowFlags: integer): HWND; stdcall;
var
  WndClass: array [0..255] of Char;
begin
 Result := 0;
 GetClassName(GetParent(ParentWin), WndClass, SizeOf(WndClass));

 if not (WndClass <> 'TTOTAL_CMD') then Exit; //С QuiqView такой фокас не прокатит

if not (.... выполняем проверку - подходит файл млм нет...) then Exit;

 if DMainData^.MainForm = 0 then
 begin
 DMainData^.MainForm:=CreateMyPluginWindow// Твой плагин
 if DMainData^.MainForm = 0 then Exit;
 end
 else
 begin
 I:=SendMessage(DMainData^.MainForm,WM_MAINCOMMAND,MYCMD,0);
 if I = 0 then Exit; // Сообщкние окну плагина о новом файле, можно WM_COPYDATA, можно что-то свое - главное передать имя файла.
 end;

 Result :=CallKiller(ParentWin);
 if Result = 0 then Exit;
 SetWindowPos(ParentWin,0,-100,-100,0,0,SWP_HIDEWINDOW);// Убираем с глаз-долой листер
end;

и "само убийство"

function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult; stdcall;
var
 Style:Longint;
 LW:HWND;
Begin
LW:=GetParent(wnd);
          PostMessage(LW,WM_KEYDOWN, 27, 0);
          Result := DefWindowProc(wnd,msg,wparam,lparam);
End;



function CallKiller(aListerWindow:HWND):HWND;
begin
result:=CreateWindowEx(WS_EX_CONTROLPARENT,'LISTER_KILLER','LISTER_KILLER',WS_CHILD or WS_VISIBLE or WS_CLIPSIBLINGS
                                          ,0,0,10,10,aListerWindow,0,Hinstance,nil);

end;


exports
....
begin
....
  WC.lpfnWndProc     := @WindowProc;
  WC.style           := CS_VREDRAW or CS_HREDRAW;
  WC.hInstance       := hInstance;
  WC.hIcon           := 0;
  WC.hCursor         := LoadCursor(0,IDC_ARROW);
  WC.hbrBackground   := CreateSolidBrush( COLOR_BTNFACE+1 );
  WC.lpszMenuName    := nil;
  WC.cbClsExtra      := 0;
  WC.cbWndExtra      := 0;
  wc.lpszClassName   := 'LIST_KILL';
 Windows.RegisterClass(wc);


...

end.
View user's profile Send private message Visit poster's website


Powered by phpBB © 2001, 2005 phpBB Group