MMInst.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:8k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {========================================================================}
  2. {=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
  3. {========================================================================}
  4. {=                          All Rights Reserved                         =}
  5. {========================================================================}
  6. {=  D 01099 Dresden             = Tel.: +0351-8012255                   =}
  7. {=  Loewenstr.7a                = info@swiftsoft.de                     =}
  8. {========================================================================}
  9. {=  Actual versions on http://www.swiftsoft.de/mmtools.html             =}
  10. {========================================================================}
  11. {=  This code is for reference purposes only and may not be copied or   =}
  12. {=  distributed in any format electronic or otherwise except one copy   =}
  13. {=  for backup purposes.                                                =}
  14. {=                                                                      =}
  15. {=  No Delphi Component Kit or Component individually or in a collection=}
  16. {=  subclassed or otherwise from the code in this unit, or associated   =}
  17. {=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
  18. {=  without express permission from SwiftSoft.                          =}
  19. {=                                                                      =}
  20. {=  For more licence informations please refer to the associated        =}
  21. {=  HelpFile.                                                           =}
  22. {========================================================================}
  23. {=  $Date: 20.01.1998 - 18:00:00 $                                      =}
  24. {========================================================================}
  25. unit MMInst;
  26. interface
  27. uses
  28.   Windows,
  29.   Messages,
  30.   SysUtils;
  31. function  InitiateDDE: Boolean;
  32. procedure TerminateDDE;
  33. function  CreateGroup(GName : String) : Boolean;
  34. procedure CreateItem (ExeFile, Description, IconFile, IconNumber: String);
  35. implementation
  36. var
  37.    Handle         : THandle;
  38.    PMWnd          : THandle;
  39.    PMLaunched     : Boolean;
  40.    AppAtom        : TAtom;
  41.    TopicAtom      : TAtom;
  42.    HDDE           : THandle;
  43.    DDEMessageSent : Word;
  44.    Command        : array[0..512] of Char;
  45.    Errr           : Boolean;
  46. {-------------------------------------------------------------------------}
  47. procedure NotifyDDE(LValue: LongInt);
  48. begin
  49.    case DDEMessageSent of
  50.    WM_DDE_INITIATE: begin
  51.           GlobalDeleteAtom(LoWord(LValue));
  52.                       GlobalDeleteAtom(Hiword(LValue));
  53.                       DDEMessageSent := 0;
  54.                       Exit;
  55.                     end;
  56.     WM_DDE_EXECUTE: begin
  57.       GlobalFree(HDDE);
  58.                       DDEMessageSent := 0;
  59.                       Exit;
  60.     end;
  61.    end;
  62. end;
  63. {------------------------------------------------------------------------}
  64. function DDEWndProc(Window: HWND; Message, wParam: UINT; lParam: Longint): Longint;export; stdcall;
  65. begin
  66.    if (Window = Handle) and (Message = WM_DDE_ACK) then
  67.    begin
  68.       if PMWnd = 0 then PMWnd := wParam;
  69.       NotifyDDE(lParam);
  70.    end;
  71.    Result := DefWindowProc(Window, Message, wParam, lParam);
  72. end;
  73. const
  74.   TDDEWindowClass: TWndClass = (
  75.     style: 0;
  76.     lpfnWndProc: @DDEWndProc;
  77.     cbClsExtra: 0;
  78.     cbWndExtra: 0;
  79.     hInstance: 0;
  80.     hIcon: 0;
  81.     hCursor: 0;
  82.     hbrBackground: 0;
  83.     lpszMenuName: nil;
  84.     lpszClassName: 'TDDEWindow');
  85. {-------------------------------------------------------------------------}
  86. function AllocateDDEWindow: HWND;
  87. var
  88.    TempClass: TWndClass;
  89.    ClassRegistered: Boolean;
  90. begin
  91.    TDDEWindowClass.hInstance := HInstance;
  92.    ClassRegistered := GetClassInfo(HInstance,
  93.                       TDDEWindowClass.lpszClassName, TempClass);
  94.     if not ClassRegistered then
  95.     begin
  96.        if ClassRegistered then
  97.           UnregisterClass(TDDEWindowClass.lpszClassName, HInstance);
  98.        RegisterClass(TDDEWindowClass);
  99.     end;
  100.     Result := CreateWindow(TDDEWindowClass.lpszClassName, '', 0,
  101.                            0, 0, 0, 0, 0, 0, HInstance, nil);
  102. end;
  103. {-------------------------------------------------------------------------}
  104. procedure ExecuteDDE (ATextString: PChar);
  105. var
  106.    Execute : PChar;
  107.    Msg     : TMsg;
  108.    i       : LongInt;
  109. begin
  110.    Errr := False;
  111.    HDDE := GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, strlen(ATextString) + 10);
  112.    Execute := GlobalLock(HDDE);
  113.    strcopy(Execute, ATextString);
  114.    GlobalUnlock(HDDE);
  115.    DDEMessageSent := WM_DDE_EXECUTE;
  116.    PostMessage(PMWnd, WM_DDE_EXECUTE, Handle, HDDE);
  117.    while (DDEMessageSent > 0) do
  118.    begin
  119.       GetMessage(Msg, Handle, 0, 0);
  120.       TranslateMessage(Msg);
  121.       DispatchMessage(Msg);
  122.       if Errr then break;
  123.    end;
  124. end;
  125. {-------------------------------------------------------------------------}
  126. procedure TerminateDDE;
  127. begin
  128.    // ev. Send Message verwenden
  129.    PostMessage(PMWnd, WM_DDE_TERMINATE, Handle, 0);
  130.    DestroyWindow(Handle);
  131. end;
  132. {-------------------------------------------------------------------------}
  133. function InitiateDDE: Boolean;
  134. begin
  135.    Result := false;
  136.    Handle := AllocateDDEWindow;
  137.    PMWnd := FindWindow('Progman', nil);
  138.    if PMWnd = 0 then
  139.    begin
  140.       WinExec('PROGMAN.EXE', SW_NORMAL);
  141.       PMWnd := GetActiveWindow;
  142.       PMLaunched := TRUE;
  143.    end;
  144.    AppAtom  := GlobalAddAtom('PROGMAN');
  145.    TopicAtom := GlobalAddAtom('PROGMAN');
  146.    DDEMessageSent := WM_DDE_INITIATE;
  147.    SendMessage(PMWnd, WM_DDE_INITIATE, Handle, MAKELONG(AppAtom, TopicAtom));
  148.    Result := True;
  149. end;
  150. {---------------------------------------------------------------------}
  151. function CreateGroup(GName : String) : Boolean;
  152. var
  153.   GroupName : Array[0..255] of Char;
  154. begin
  155.    Result := false;
  156.    StrPCopy(GroupName, GName);
  157.    StrCopy(Command, '[CreateGroup(');
  158.    StrCat(Command, GroupName);
  159.    StrCat(Command, ')]');
  160.    ExecuteDDE(Command);
  161.    StrCopy(Command, 'ShowGroup(');
  162.    StrCat(Command, GroupName);
  163.    (* 1 activates and shows the group opened at normal size.
  164.         Other values are
  165.       2 to activate the group and show it minimized,
  166.       3 to activate the group and  show it maximized or
  167.       7 to minimize the group without activating it.
  168.    *)
  169.    StrCat(Command, ',1)]');
  170.    ExecuteDDE(Command);
  171.    Result := True;
  172. end;
  173. {-------------------------------------------------------------------------}
  174. procedure UCreateItem (PExeFile     : PChar;
  175.                        PDescription : PChar;
  176.                        PIconFile    : PChar;
  177.                        PIconNumber  : PChar;
  178.                    Var XCommand     : String);
  179. Var
  180.  Command : Array[0..255] of char;
  181. begin
  182.    strcat(strcat(strcopy(Command, '[AddItem('), PExeFile), ',');
  183.    if strlen(PIconFile) <> 0 then
  184.    begin
  185.       strcat(strcat(Command, PDescription), ',');
  186.       strcat(strcat(Command, PIconFile), ',');
  187.       strcat(strcat(Command, PIconNumber), ')]');
  188.    end
  189.    else if strlen(PIconNumber) <> 0 then
  190.    begin
  191.       strcat(strcat(Command, PDescription), ',');
  192.       strcat(strcat(Command, PExeFile), ',');
  193.       strcat(strcat(Command, PIconNumber), ')]');
  194.    end
  195.    else strcat(strcat(Command, PDescription), ')]');
  196.   XCommand:=StrPas(Command);
  197. end;
  198. {-------------------------------------------------------------------------}
  199. procedure CreateItem (ExeFile, Description, IconFile, IconNumber: String);
  200. var
  201.    PExeFile, PDescription, PIconFile, PIconNumber: Array[0..255] of Char;
  202.    XCommand : String;
  203. begin
  204.    StrPCopy(PExeFile, ExeFile);
  205.    StrPCopy(PDescription, Description);
  206.    StrPCopy(PIconFile, IconFile);
  207.    StrPCopy(PIconNumber, IconNumber);
  208.    UCreateItem (PExeFile,
  209.                 PDescription,
  210.                 PIconFile,
  211.                 PIconNumber,
  212.                 XCommand);
  213.    StrPCopy(Command, XCommand);
  214.    ExecuteDDE(Command);
  215. end;
  216. end.