| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- unit Unit2;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, ShellApi, ComCtrls;
- type
- PCHANGEFILTERSTRUCT = ^TCHANGEFILTERSTRUCT;
- TCHANGEFILTERSTRUCT = record
- cbSize: DWORD;
- ExtStatus: DWORD ;
- end;
- TForm2 = class(TForm)
- RichEdit: TRichEdit;
- Edit: TEdit;
- procedure FormCreate(Sender: TObject);
- procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
- procedure RichEditMouseActivate(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y, HitTest: Integer;
- var MouseActivate: TMouseActivate);
- procedure FormDestroy(Sender: TObject);
- procedure FormDropFiles(Sender: TObject; const FileNames: array of String);
- procedure FormDragOver(Sender, Source: TObject; X, Y: Integer;
- State: TDragState; var Accept: Boolean);
- procedure RichEditClick(Sender: TObject);
- procedure RichEditDblClick(Sender: TObject);
- procedure RichEditMouseLeave(Sender: TObject);
- procedure RichEditEndDrag(Sender, Target: TObject; X, Y: Integer);
-
- private
- function AllowMeesageForVistaAbove(uMessageID: UINT; bAllow:Boolean):Boolean;
- protected
- procedure DragFileProc(var Message: TMessage);
- public
- ChangeWindowMessageFilter: function(msg: UINT; dwFlag: DWORD): BOOL; stdcall;
- ChangeWindowMessageFilterEx: function(hd: HWnd; msg: UINT; dwFlag: DWORD; pc: PCHANGEFILTERSTRUCT): BOOL; stdcall;
- end;
- var
- Form2: TForm2;
- HookID: THandle;
- implementation
- var
- OLDWndProc: TWndMethod;
- function MouseProc(nCode: Integer; wParam, lParam: Longint): Longint; stdcall;
- begin
- case nCode < 0 of
- True:
- Result := CallNextHookEx(HookID, nCode, wParam, lParam) else
- case wParam of
- WM_MOUSEMOVE:
- Form2.RichEdit.Text := '22222';
- //Dialogs.ShowMessage('2222');
- else
- Result := CallNextHookEx(HookID, nCode, wParam, lParam);
- end;
- end;
- end;
- {$R *.dfm}
- //register global messages for vista win7.
- function TForm2.AllowMeesageForVistaAbove(uMessageID: THandle; bAllow: Boolean): Boolean;
- var
- bResult: Boolean;
- hUserMod: HMODULE;
- begin
- bResult := False;
- hUserMod := Null;
- //vista and later
- hUserMod := LoadLibrary(PChar('user32.dll'));
- if( NULL = hUserMod ) then
- begin
- Result := FALSE;
- Exit;
- end;
- ChangeWindowMessageFilter := GetProcAddress(hUserMod,'ChangeWindowMessageFilter');
- if not Assigned(ChangeWindowMessageFilter) then
- begin
- Result:= FALSE;
- FreeLibrary(hUserMod);
- Exit;
- end;
- if bAllow then
- bResult := ChangeWindowMessageFilter(uMessageID, 1)
- else
- bResult := ChangeWindowMessageFilter(uMessageID, 2);//MSGFLT_ADD: 1, MSGFLT_REMOVE: 2
- if ( NULL <> hUserMod ) then
- begin
- FreeLibrary( hUserMod );
- end;
- result:= bResult;
- end;
- procedure TForm2.DragFileProc(var Message: TMessage);
- var
- FileNum: Word;
- p: array[0..254] of char;
- begin
- if Message.Msg = WM_DropFiles then
- begin
- //Self.RichEdit.ReadOnly := true;
- Self.RichEdit.Clear;
- FileNum := DragQueryFile(Message.WParam, $FFFFFFFF, nil, 0);
- // 取得拖放文件总数
- for FileNum := 0 to FileNum - 1 do
- begin
- DragQueryFile(Message.WParam, FileNum, p, 255);
- // 取得拖放文件名
- //Self.MemoDrag.Lines.add(StrPas(p));
- //对文件的处理
- RichEdit.Lines.LoadFromFile(StrPas(p));
- end;
- //SendMessage(RichEdit.Handle, WM_DropFiles, Message.WParam,Message.LParam);
- DragFinish(Message.wParam);
- Message.Result := 1;
- //Self.RichEdit.ReadOnly := false;
- end
- else // 其他消息,调用原来的处理程序
- OLDWndProc(Message);
- end;
- procedure TForm2.FormCreate(Sender: TObject);
- var
- hUserMod: HMODULE;
- begin
- DragAcceptFiles(Self.Handle, True);
- DragAcceptFiles(Self.RichEdit.Handle, True);
- //DragAcceptFiles(Self.Edit.Handle, True);
- //RichEdit.Brush.Style := bsClear;
- //SetWindowLong(RichEdit.Handle,GWL_EXSTYLE,GetWindowLong(RichEdit.Handle, GWL_EXSTYLE) or WS_EX_TRANSPARENT);
- AllowMeesageForVistaAbove(WM_COPYDATA, True);
- AllowMeesageForVistaAbove($0049, True);
- AllowMeesageForVistaAbove(WM_DROPFILES, True);
- hUserMod := LoadLibrary(PChar('user32.dll'));
- ChangeWindowMessageFilterEx := GetProcAddress(hUserMod,'ChangeWindowMessageFilterEx');
- ChangeWindowMessageFilterEx(Self.RichEdit.Handle, WM_COPYDATA, 1, nil);
- ChangeWindowMessageFilterEx(Self.RichEdit.Handle, $0049, 1, nil);
- ChangeWindowMessageFilterEx(Self.RichEdit.Handle, WM_DROPFILES, 1, nil);
- FreeLibrary(hUserMod);
- OLDWndProc := Self.RichEdit.WindowProc;
- Self.RichEdit.WindowProc := Self.DragFileProc;
- Self.RichEdit.Lines.Clear;
- //RichEdit.ReadOnly := True;
- // if HookID <> 0 then
- // UnHookWindowsHookEx(HookID);
- //HookID := SetWindowsHookEx(WH_MOUSE, MouseProc, HInstance, GetCurrentThreadId());
- RichEdit.ReadOnly := true;
- end;
- procedure TForm2.FormDestroy(Sender: TObject);
- begin
- //UnHookWindowsHookEx(HookID);
- end;
- procedure TForm2.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
- Y: Integer);
- begin
- // if ssLeft in Shift then
- // //RichEdit.ReadOnly := True;
- // RichEdit.Text := '1111'
- end;
- procedure TForm2.RichEditClick(Sender: TObject);
- begin
- RichEdit.ReadOnly := false;
- end;
- procedure TForm2.RichEditDblClick(Sender: TObject);
- begin
- RichEdit.ReadOnly := false;
- end;
- procedure TForm2.RichEditEndDrag(Sender, Target: TObject; X, Y: Integer);
- begin
- RichEdit.ReadOnly := true;
- end;
- procedure TForm2.RichEditMouseActivate(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y, HitTest: Integer;
- var MouseActivate: TMouseActivate);
- begin
- //RichEdit.Text := '1111'
- RichEdit.ReadOnly := false;
- end;
- procedure TForm2.RichEditMouseLeave(Sender: TObject);
- begin
- RichEdit.ReadOnly := true;
- end;
- procedure TForm2.FormDragOver(Sender, Source: TObject; X, Y: Integer;
- State: TDragState; var Accept: Boolean);
- begin
- ShowMessage('llll');
- end;
- procedure TForm2.FormDropFiles(Sender: TObject; const FileNames: array of String);
- var FileName : String;
- begin
- for FileName in FileNames do
- begin
- ShowMessage(FileName);
- end;
- end;
- //------------------------------------------------------------------------------
- // oldPoint,newPoint:TPOINT
- // GetCursorPos(oldPoint); //保存当前鼠标位置。
- // newPoint.x = oldPoint.x+40;
- // newPoint.y = oldPoint.y+10;
- // SetCursorPos(newPoint.x,newPoint.y); //设置目的地位置。
- // mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);//模拟按下鼠标右键。
- // mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);//模拟放开鼠标右键。
- // mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//模拟按下鼠标左键。
- // mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//模拟放开鼠标左键。
- // keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),0,0); //按下SHIFT键。
- // keybd_event(0x52,MapVirtualKey(0x52,0),0,0);//按下R键。
- // keybd_event(0x52,MapVirtualKey(0x52,0),KEYEVENTF_KEYUP,0);//放开R键。
- // keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),KEYEVENTF_KEYUP,0);//放开SHIFT键。
- // SetCursorPos(oldPoint.x,oldPoint.y);
- end.
|