Unit2.pas 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. unit Unit2;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, StdCtrls, ShellApi, ComCtrls;
  6. type
  7. PCHANGEFILTERSTRUCT = ^TCHANGEFILTERSTRUCT;
  8. TCHANGEFILTERSTRUCT = record
  9. cbSize: DWORD;
  10. ExtStatus: DWORD ;
  11. end;
  12. TForm2 = class(TForm)
  13. RichEdit: TRichEdit;
  14. Edit: TEdit;
  15. procedure FormCreate(Sender: TObject);
  16. procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  17. procedure RichEditMouseActivate(Sender: TObject; Button: TMouseButton;
  18. Shift: TShiftState; X, Y, HitTest: Integer;
  19. var MouseActivate: TMouseActivate);
  20. procedure FormDestroy(Sender: TObject);
  21. procedure FormDropFiles(Sender: TObject; const FileNames: array of String);
  22. procedure FormDragOver(Sender, Source: TObject; X, Y: Integer;
  23. State: TDragState; var Accept: Boolean);
  24. procedure RichEditClick(Sender: TObject);
  25. procedure RichEditDblClick(Sender: TObject);
  26. procedure RichEditMouseLeave(Sender: TObject);
  27. procedure RichEditEndDrag(Sender, Target: TObject; X, Y: Integer);
  28. private
  29. function AllowMeesageForVistaAbove(uMessageID: UINT; bAllow:Boolean):Boolean;
  30. protected
  31. procedure DragFileProc(var Message: TMessage);
  32. public
  33. ChangeWindowMessageFilter: function(msg: UINT; dwFlag: DWORD): BOOL; stdcall;
  34. ChangeWindowMessageFilterEx: function(hd: HWnd; msg: UINT; dwFlag: DWORD; pc: PCHANGEFILTERSTRUCT): BOOL; stdcall;
  35. end;
  36. var
  37. Form2: TForm2;
  38. HookID: THandle;
  39. implementation
  40. var
  41. OLDWndProc: TWndMethod;
  42. function MouseProc(nCode: Integer; wParam, lParam: Longint): Longint; stdcall;
  43. begin
  44. case nCode < 0 of
  45. True:
  46. Result := CallNextHookEx(HookID, nCode, wParam, lParam) else
  47. case wParam of
  48. WM_MOUSEMOVE:
  49. Form2.RichEdit.Text := '22222';
  50. //Dialogs.ShowMessage('2222');
  51. else
  52. Result := CallNextHookEx(HookID, nCode, wParam, lParam);
  53. end;
  54. end;
  55. end;
  56. {$R *.dfm}
  57. //register global messages for vista win7.
  58. function TForm2.AllowMeesageForVistaAbove(uMessageID: THandle; bAllow: Boolean): Boolean;
  59. var
  60. bResult: Boolean;
  61. hUserMod: HMODULE;
  62. begin
  63. bResult := False;
  64. hUserMod := Null;
  65. //vista and later
  66. hUserMod := LoadLibrary(PChar('user32.dll'));
  67. if( NULL = hUserMod ) then
  68. begin
  69. Result := FALSE;
  70. Exit;
  71. end;
  72. ChangeWindowMessageFilter := GetProcAddress(hUserMod,'ChangeWindowMessageFilter');
  73. if not Assigned(ChangeWindowMessageFilter) then
  74. begin
  75. Result:= FALSE;
  76. FreeLibrary(hUserMod);
  77. Exit;
  78. end;
  79. if bAllow then
  80. bResult := ChangeWindowMessageFilter(uMessageID, 1)
  81. else
  82. bResult := ChangeWindowMessageFilter(uMessageID, 2);//MSGFLT_ADD: 1, MSGFLT_REMOVE: 2
  83. if ( NULL <> hUserMod ) then
  84. begin
  85. FreeLibrary( hUserMod );
  86. end;
  87. result:= bResult;
  88. end;
  89. procedure TForm2.DragFileProc(var Message: TMessage);
  90. var
  91. FileNum: Word;
  92. p: array[0..254] of char;
  93. begin
  94. if Message.Msg = WM_DropFiles then
  95. begin
  96. //Self.RichEdit.ReadOnly := true;
  97. Self.RichEdit.Clear;
  98. FileNum := DragQueryFile(Message.WParam, $FFFFFFFF, nil, 0);
  99. // 取得拖放文件总数
  100. for FileNum := 0 to FileNum - 1 do
  101. begin
  102. DragQueryFile(Message.WParam, FileNum, p, 255);
  103. // 取得拖放文件名
  104. //Self.MemoDrag.Lines.add(StrPas(p));
  105. //对文件的处理
  106. RichEdit.Lines.LoadFromFile(StrPas(p));
  107. end;
  108. //SendMessage(RichEdit.Handle, WM_DropFiles, Message.WParam,Message.LParam);
  109. DragFinish(Message.wParam);
  110. Message.Result := 1;
  111. //Self.RichEdit.ReadOnly := false;
  112. end
  113. else // 其他消息,调用原来的处理程序
  114. OLDWndProc(Message);
  115. end;
  116. procedure TForm2.FormCreate(Sender: TObject);
  117. var
  118. hUserMod: HMODULE;
  119. begin
  120. DragAcceptFiles(Self.Handle, True);
  121. DragAcceptFiles(Self.RichEdit.Handle, True);
  122. //DragAcceptFiles(Self.Edit.Handle, True);
  123. //RichEdit.Brush.Style := bsClear;
  124. //SetWindowLong(RichEdit.Handle,GWL_EXSTYLE,GetWindowLong(RichEdit.Handle, GWL_EXSTYLE) or WS_EX_TRANSPARENT);
  125. AllowMeesageForVistaAbove(WM_COPYDATA, True);
  126. AllowMeesageForVistaAbove($0049, True);
  127. AllowMeesageForVistaAbove(WM_DROPFILES, True);
  128. hUserMod := LoadLibrary(PChar('user32.dll'));
  129. ChangeWindowMessageFilterEx := GetProcAddress(hUserMod,'ChangeWindowMessageFilterEx');
  130. ChangeWindowMessageFilterEx(Self.RichEdit.Handle, WM_COPYDATA, 1, nil);
  131. ChangeWindowMessageFilterEx(Self.RichEdit.Handle, $0049, 1, nil);
  132. ChangeWindowMessageFilterEx(Self.RichEdit.Handle, WM_DROPFILES, 1, nil);
  133. FreeLibrary(hUserMod);
  134. OLDWndProc := Self.RichEdit.WindowProc;
  135. Self.RichEdit.WindowProc := Self.DragFileProc;
  136. Self.RichEdit.Lines.Clear;
  137. //RichEdit.ReadOnly := True;
  138. // if HookID <> 0 then
  139. // UnHookWindowsHookEx(HookID);
  140. //HookID := SetWindowsHookEx(WH_MOUSE, MouseProc, HInstance, GetCurrentThreadId());
  141. RichEdit.ReadOnly := true;
  142. end;
  143. procedure TForm2.FormDestroy(Sender: TObject);
  144. begin
  145. //UnHookWindowsHookEx(HookID);
  146. end;
  147. procedure TForm2.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  148. Y: Integer);
  149. begin
  150. // if ssLeft in Shift then
  151. // //RichEdit.ReadOnly := True;
  152. // RichEdit.Text := '1111'
  153. end;
  154. procedure TForm2.RichEditClick(Sender: TObject);
  155. begin
  156. RichEdit.ReadOnly := false;
  157. end;
  158. procedure TForm2.RichEditDblClick(Sender: TObject);
  159. begin
  160. RichEdit.ReadOnly := false;
  161. end;
  162. procedure TForm2.RichEditEndDrag(Sender, Target: TObject; X, Y: Integer);
  163. begin
  164. RichEdit.ReadOnly := true;
  165. end;
  166. procedure TForm2.RichEditMouseActivate(Sender: TObject; Button: TMouseButton;
  167. Shift: TShiftState; X, Y, HitTest: Integer;
  168. var MouseActivate: TMouseActivate);
  169. begin
  170. //RichEdit.Text := '1111'
  171. RichEdit.ReadOnly := false;
  172. end;
  173. procedure TForm2.RichEditMouseLeave(Sender: TObject);
  174. begin
  175. RichEdit.ReadOnly := true;
  176. end;
  177. procedure TForm2.FormDragOver(Sender, Source: TObject; X, Y: Integer;
  178. State: TDragState; var Accept: Boolean);
  179. begin
  180. ShowMessage('llll');
  181. end;
  182. procedure TForm2.FormDropFiles(Sender: TObject; const FileNames: array of String);
  183. var FileName : String;
  184. begin
  185. for FileName in FileNames do
  186. begin
  187. ShowMessage(FileName);
  188. end;
  189. end;
  190. //------------------------------------------------------------------------------
  191. // oldPoint,newPoint:TPOINT
  192. // GetCursorPos(oldPoint); //保存当前鼠标位置。
  193. // newPoint.x = oldPoint.x+40;
  194. // newPoint.y = oldPoint.y+10;
  195. // SetCursorPos(newPoint.x,newPoint.y); //设置目的地位置。
  196. // mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);//模拟按下鼠标右键。
  197. // mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);//模拟放开鼠标右键。
  198. // mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//模拟按下鼠标左键。
  199. // mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//模拟放开鼠标左键。
  200. // keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),0,0); //按下SHIFT键。
  201. // keybd_event(0x52,MapVirtualKey(0x52,0),0,0);//按下R键。
  202. // keybd_event(0x52,MapVirtualKey(0x52,0),KEYEVENTF_KEYUP,0);//放开R键。
  203. // keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),KEYEVENTF_KEYUP,0);//放开SHIFT键。
  204. // SetCursorPos(oldPoint.x,oldPoint.y);
  205. end.