お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"デスクトップダブルクリックでポップアップ"

この発言に対し以下のコメントが寄せられています
#01154 雪見酒 さん RE:デスクトップダブルクリックでポップア

nifty:FDELPHI/MES/8/11886以降のスレッドで話題になった、デスクトップで のダブルクリックで、マウスメッセージをフックして、メニューをポップ アップするサンプルです。ActiveDesktopには対応してません。どなたかハン ドル取得の方法をご存知の方、フォローお願いします。 また、デスクトップ上のアイコンをダブルクリックしても、フックするのは悩 ましいところです。こちらもどなたかよろしく。m(_ _;)m (ハンドルやHitTestCodeでは対応できません。) なお、エラーには一切対応してません。エラー処理の方法は、 nifty:FDELPHI/LIB/16/113 トム猫さんのサンプルを参考にしてください。 //-------------------MousHook.dpr------------------------------------ library MouseHook; uses SysUtils,Classes,MouseHookMain in 'MouseHookMain.pas'; {$R *.RES} exports InstallHookProc,UnInstallHookProc; begin end. //-------------------MouseHookMain.pas------------------------------- unit MouseHookMain; interface Uses SysUtils,Classes,Windows,Messages,Dialogs; type THostWnd = hWnd; PHostWnd = ^THostWnd; function mouseProc(nCode:integer; wParam:integer; lParam:LongInt):integer;stdcall; function InstallHookProc(wnd:hWnd):integer;export;stdcall; function UnInstallHookProc:integer;export;stdcall; const uniqueString = 'MouseHookShareString'; MyDblClkMsg = WM_USER+101; MyBtnDwnMsg = WM_USER+102; var hShareMem:THandle; hndHook:HHook; implementation function mouseProc(nCode:integer; wParam:integer; lParam:LongInt) :integer;stdcall; //mouseHook のコールバック関数 var ptr: pointer; hDskTop:hWnd; begin if nCode = HC_ACTION then begin //シェアメモリへアクセス ptr := MapViewOfFile(hShareMem, FILE_MAP_ALL_ACCESS, 0, 0, 0); // デスクトップのハンドル取得、ActiveDesktop は未対応(^^; hDskTop := FindWindow('Progman', nil); hDskTop := FindWindowEx(hDskTop, 0, 'SHELLDLL_DefView', nil); hDskTop := FindWindowEx(hDskTop, 0, 'SysListView32', nil); if wParam = WM_LBUTTONDOWN then PostMessage(PHostWnd(ptr)^, MyBtnDwnMsg, 0, 0); if (hDskTop = PMouseHookStruct(lParam).hwnd) and (wParam = WM_LBUTTONDBLCLK) then PostMessage(PHostWnd(ptr)^, MyDblClkMsg, 0, 0); //アクセス終了 UnmapViewOfFile(ptr) ; result:=0; //システムに戻す。メッセ−ジを破棄する場合は0以外 end else //次のHookへMessageを渡す result := CallNextHookEx(hndHook, nCode, wParam, lParam); end; function InstallHookProc(wnd: hWnd):integer; stdcall; //Hookをインストール var ptr:pointer; begin //シェアメモリへアクセス ptr := MapViewOfFile(hShareMem, FILE_MAP_ALL_ACCESS, 0,0,0); PHostWnd(ptr)^:=wnd; HndHook := SetWindowsHookEx(WH_MOUSE,@mouseProc,hInstance,0); UnmapViewOfFile(ptr); //アクセス終了 Result := HndHook; end; function UnInstallHookProc:integer; //Hookのアンインストール begin if UnHookWindowsHookEx(HndHook) then result:= 0 else result:=-1; end; initialization // シェアメモリ確保 begin hShareMem := CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE, 0,SizeOf(THostWnd),UniqueString); end; finalization //シェアメモリ開放 begin if hShareMem = 0 then exit; CloseHandle(hShareMem); end; end. //------------------------Unit1.pas---------------------------------- //プロジェクトはフォームと、メニューだけ unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus; type TForm1 = class(TForm) PopupMenu1: TPopupMenu; N11: TMenuItem; N21: TMenuItem; N31: TMenuItem; procedure WMMyDblClk(var Message:TMessage);message WM_USER+101; procedure WMMyBtnDwn(var Message:TMessage);message WM_USER+102; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCreate(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; function InstallHookProc(wnd: hWnd):integer;stdcall;external'MouseHook.dll'; function UnInstallHookProc:integer;stdcall;external'MouseHook.dll'; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.WMMyDblClk(var Message:TMessage); begin PopupMenu1.Popup(100,100);//ポップアップする場所はお好きなように end; procedure TForm1.WMMyBtnDwn(var Message:TMessage); // ポップアップメニューの消去 begin PostMessage(PopupMenu1.WindowHandle,WM_LBUTTONDOWN,0,0); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin UnInstallHookProc; end; procedure TForm1.FormCreate(Sender: TObject); begin InstallHookProc(Form1.Handle); end; end. Yukimi Sake GHE01746@nifty.ne.jp  Original document by 雪見酒 氏 ID:(GHE01746)



ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum