⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mminst.pas

📁 一套及时通讯的原码
💻 PAS
字号:
{========================================================================}
{=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
{========================================================================}
{=                          All Rights Reserved                         =}
{========================================================================}
{=  D 01099 Dresden             = Tel.: +0351-8012255                   =}
{=  Loewenstr.7a                = info@swiftsoft.de                     =}
{========================================================================}
{=  Actual versions on http://www.swiftsoft.de/mmtools.html             =}
{========================================================================}
{=  This code is for reference purposes only and may not be copied or   =}
{=  distributed in any format electronic or otherwise except one copy   =}
{=  for backup purposes.                                                =}
{=                                                                      =}
{=  No Delphi Component Kit or Component individually or in a collection=}
{=  subclassed or otherwise from the code in this unit, or associated   =}
{=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
{=  without express permission from SwiftSoft.                          =}
{=                                                                      =}
{=  For more licence informations please refer to the associated        =}
{=  HelpFile.                                                           =}
{========================================================================}
{=  $Date: 20.01.1998 - 18:00:00 $                                      =}
{========================================================================}
unit MMInst;

interface

uses
  Windows,
  Messages,
  SysUtils;

function  InitiateDDE: Boolean;
procedure TerminateDDE;
function  CreateGroup(GName : String) : Boolean;
procedure CreateItem (ExeFile, Description, IconFile, IconNumber: String);

implementation

var
   Handle         : THandle;
   PMWnd          : THandle;
   PMLaunched     : Boolean;
   AppAtom        : TAtom;
   TopicAtom      : TAtom;
   HDDE           : THandle;
   DDEMessageSent : Word;
   Command        : array[0..512] of Char;
   Errr           : Boolean;

{-------------------------------------------------------------------------}
procedure NotifyDDE(LValue: LongInt);
begin
   case DDEMessageSent of
   WM_DDE_INITIATE: begin
   		      GlobalDeleteAtom(LoWord(LValue));
                      GlobalDeleteAtom(Hiword(LValue));
                      DDEMessageSent := 0;
                      Exit;
                    end;

    WM_DDE_EXECUTE: begin
		      GlobalFree(HDDE);
                      DDEMessageSent := 0;
                      Exit;
		    end;
   end;
end;

{------------------------------------------------------------------------}
function DDEWndProc(Window: HWND; Message, wParam: UINT; lParam: Longint): Longint;export; stdcall;
begin
   if (Window = Handle) and (Message = WM_DDE_ACK) then
   begin
      if PMWnd = 0 then PMWnd := wParam;
      NotifyDDE(lParam);
   end;
   Result := DefWindowProc(Window, Message, wParam, lParam);
end;

const
  TDDEWindowClass: TWndClass = (
    style: 0;
    lpfnWndProc: @DDEWndProc;
    cbClsExtra: 0;
    cbWndExtra: 0;
    hInstance: 0;
    hIcon: 0;
    hCursor: 0;
    hbrBackground: 0;
    lpszMenuName: nil;
    lpszClassName: 'TDDEWindow');

{-------------------------------------------------------------------------}
function AllocateDDEWindow: HWND;
var
   TempClass: TWndClass;
   ClassRegistered: Boolean;
begin
   TDDEWindowClass.hInstance := HInstance;
   ClassRegistered := GetClassInfo(HInstance,
                      TDDEWindowClass.lpszClassName, TempClass);
    if not ClassRegistered then
    begin
       if ClassRegistered then
          UnregisterClass(TDDEWindowClass.lpszClassName, HInstance);
       RegisterClass(TDDEWindowClass);
    end;
    Result := CreateWindow(TDDEWindowClass.lpszClassName, '', 0,
                           0, 0, 0, 0, 0, 0, HInstance, nil);
end;

{-------------------------------------------------------------------------}
procedure ExecuteDDE (ATextString: PChar);
var
   Execute : PChar;
   Msg     : TMsg;
   i       : LongInt;

begin
   Errr := False;
   HDDE := GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, strlen(ATextString) + 10);
   Execute := GlobalLock(HDDE);
   strcopy(Execute, ATextString);
   GlobalUnlock(HDDE);
   DDEMessageSent := WM_DDE_EXECUTE;

   PostMessage(PMWnd, WM_DDE_EXECUTE, Handle, HDDE);

   while (DDEMessageSent > 0) do
   begin
      GetMessage(Msg, Handle, 0, 0);
      TranslateMessage(Msg);
      DispatchMessage(Msg);
      if Errr then break;
   end;
end;

{-------------------------------------------------------------------------}
procedure TerminateDDE;
begin
   // ev. Send Message verwenden
   PostMessage(PMWnd, WM_DDE_TERMINATE, Handle, 0);
   DestroyWindow(Handle);
end;

{-------------------------------------------------------------------------}
function InitiateDDE: Boolean;
begin
   Result := false;

   Handle := AllocateDDEWindow;

   PMWnd := FindWindow('Progman', nil);
   if PMWnd = 0 then
   begin
      WinExec('PROGMAN.EXE', SW_NORMAL);
      PMWnd := GetActiveWindow;
      PMLaunched := TRUE;
   end;

   AppAtom  := GlobalAddAtom('PROGMAN');
   TopicAtom := GlobalAddAtom('PROGMAN');

   DDEMessageSent := WM_DDE_INITIATE;

   SendMessage(PMWnd, WM_DDE_INITIATE, Handle, MAKELONG(AppAtom, TopicAtom));

   Result := True;
end;

{---------------------------------------------------------------------}
function CreateGroup(GName : String) : Boolean;
var
  GroupName : Array[0..255] of Char;

begin
   Result := false;

   StrPCopy(GroupName, GName);
   StrCopy(Command, '[CreateGroup(');
   StrCat(Command, GroupName);
   StrCat(Command, ')]');
   ExecuteDDE(Command);

   StrCopy(Command, 'ShowGroup(');
   StrCat(Command, GroupName);

   (* 1 activates and shows the group opened at normal size.
        Other values are
      2 to activate the group and show it minimized,
      3 to activate the group and  show it maximized or
      7 to minimize the group without activating it.
   *)
   StrCat(Command, ',1)]');
   ExecuteDDE(Command);
   Result := True;
end;

{-------------------------------------------------------------------------}
procedure UCreateItem (PExeFile     : PChar;
                       PDescription : PChar;
                       PIconFile    : PChar;
                       PIconNumber  : PChar;
                   Var XCommand     : String);
Var
 Command : Array[0..255] of char;

begin
   strcat(strcat(strcopy(Command, '[AddItem('), PExeFile), ',');
   if strlen(PIconFile) <> 0 then
   begin
      strcat(strcat(Command, PDescription), ',');
      strcat(strcat(Command, PIconFile), ',');
      strcat(strcat(Command, PIconNumber), ')]');
   end
   else if strlen(PIconNumber) <> 0 then
   begin
      strcat(strcat(Command, PDescription), ',');
      strcat(strcat(Command, PExeFile), ',');
      strcat(strcat(Command, PIconNumber), ')]');
   end
   else strcat(strcat(Command, PDescription), ')]');

  XCommand:=StrPas(Command);
end;

{-------------------------------------------------------------------------}
procedure CreateItem (ExeFile, Description, IconFile, IconNumber: String);
var
   PExeFile, PDescription, PIconFile, PIconNumber: Array[0..255] of Char;
   XCommand : String;

begin
   StrPCopy(PExeFile, ExeFile);
   StrPCopy(PDescription, Description);
   StrPCopy(PIconFile, IconFile);
   StrPCopy(PIconNumber, IconNumber);

   UCreateItem (PExeFile,
                PDescription,
                PIconFile,
                PIconNumber,
                XCommand);

   StrPCopy(Command, XCommand);
   ExecuteDDE(Command);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -