皆様よろしくお願いします。環境はWindows7 Delphi 6 Personalです。
下記のコードはWebBrowser1とWebBrowser2をFormにおいて
それぞれフォルダパスを表示させておきます。
それぞれのアイコンをダブルクリックしてアイコンのフルパスを取得
しようと試みているコードです。
質問:
もし、WebBrowser2だけなら表示中のフォルダパスに取得したファイル名を
付ければフルパスを取得できるのですが、
WebBrowserが2個だとどちらのアイコンをダブルクリックしたか
判別する手法が解りません(#この状態ではWebBrowser2しか取得できない)
lParamの数字が違うので何とか判別できないか試みましたが
知識がありません。
ダブルクリックしたコントロールを取得できないでしょうか。
WebBrowser1WebBrowser2のフォルダパスは判っているわけですから
それぞれのフォルダパスに付ければフルパスが取得できると
考えています。
よろしくお願いします。
const
LV_name = 'SysListView32';
var
Form1: TForm1;
HookID : THandle;
implementation
//WinSearchはMr.XRAY氏のユニットを使用しサンプルを参考にしました
// http://mrxray.on.coocan.jp/Halbow/ProgCode/WinSearch.txt
//これを拡張子をpasにしてprojectに追加しました。
uses WinSearch,CommCtrl{LVIS_SELECTED; で必要};
{$R *.dfm}
//---------------------サムネイルをダブルクリックしたフルパスを取得したい
function MouseProc(nCode: Integer; wParam, lParam: Longint): Longint; stdcall;
var
Str : String;
ItemCount : Integer;
hListView : HWND;
procedure FileNameGet;
var
iState : Integer;
i : Integer;
mask : Integer;
pszText : array[0..255] of AnsiChar;
begin
mask := LVIS_SELECTED;
for i:=0 to ItemCount-1 do
begin
iState := ListView_GetItemState(hListView,i,mask);
if (iState and LVIS_SELECTED)<>0 then
begin
ListView_GetItemText(hListView,i,0,pszText,SizeOf(pszText));
Str:= pszText;
{ //ここでどちらのWebbrowserをダブルクリックしたか記憶を判定できれば
if '記憶の判定' then
Str:= ('Webbrowser1に表示しているフォルダパス')+ str
else
Str:= ('Webbrowser2に表示しているフォルダパス')+ str;}
break;
end;
end;
end;
var
szClassName : array[0..255] of Char;
begin
if (nCode < 0) then
begin
Result := CallNextHookEx(HookID, nCode, wParam, lParam);
exit;
end;
if (wParam = WM_LBUTTONDBLCLK) then
begin
hListView := FindChildOfClass(Form1.Handle,LV_Name);
ItemCount := ListView_GetItemCount(hListView);
GetClassName(PMOUSEHOOKSTRUCT(lParam)^.HWND,szClassName,SizeOf(szClassName));
//ここでどちらのWebbrowserをダブルクリックしたかを記憶できれば
if lstrcmp(@szClassName[0], @LV_name[1]) = 0 then
begin
FileNameGet;
showmessage(str);
//ここでどちらのWebbrowserをダブルクリックしたか
//記憶を判定できれば フルパスを表示できる
{if '記憶の判定' then
showmessage(str) //Webbrowser1の処理
esle
showmessage(str); //Webbrowser2の処理}
Result := HC_SKIP;
exit;
end;
end;
Result := CallNextHookEx(HookID, nCode, wParam, lParam);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
HookID := SetWindowsHookEx(WH_MOUSE, MouseProc, 0, GetCurrentThreadId()); //フック開始
Webbrowser1.Navigate('フォルダパス');
Webbrowser2.Navigate('フォルダパス');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if HookID <> 0 then UnHookWindowsHookEx(HookID);//フック終了
end;
無理やりやるなら、こんな感じかと。
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
if Msg.message = WM_LButtonDown then
Caption := FindDragTarget(Mouse.CursorPos, True).Name;
end;
やっていることはよく分かりませんが,
マウスフックを使用しているのであれば,フックのコールバック関数の引数から
マウス座標が取得できます.この座標値で判定できるような気がしますが.
マウスの座標値は,GetCursorPos 関数でも取得できます.
[MouseProc 関数]
http://msdn.microsoft.com/ja-jp/library/cc429978.aspx
>サムネイルをダブルクリックしたフルパスを取得したい
ということでしたら,ダブルクリックを検出すればいいので,
TApplicationEvents(Additionalタブ) コンポを使用した例です.
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=1177.0
Delphi 6 Personal 版で使えるかどうかは分かりません.
Personal 版を使いこなしている方もいるようですので,
そちらからの情報提供を期待してください.
あさん、Mr.XRAY さん ご返事ありがとうございます。
これから、皆様のアドバイスをもとに試みてみます。
2個置いたときの挙動がかなり変化するので
あるいは無理矢理する、またマウスポジションから判別する
など非常にヒントになりました。私でも、いけるかもという気がします。
レベルが低いため、試行錯誤に時間をとりますから
一応、解決としてこの質問をクローズしておきます。
結果はまたお知らせします。
ありがとうございました。
あさん、Mr.XRAY さんどちらも成功しました。
下記のようにしてみたのですが、
たぶん馬鹿なコードを書いていると思いますが。
//WinSearchはMr.XRAY氏のユニットを使用しサンプルを参考にしました
// http://mrxray.on.coocan.jp/Halbow/ProgCode/WinSearch.txt
//これを拡張子をpasにしてprojectに追加
uses WinSearch,CommCtrl{LVIS_SELECTED; で必要};
{$R *.dfm}
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
var
Comp : TComponent;
P : TPoint;
begin
//***********あ さんの回答******************
if Msg.message = WM_LButtonDown then
Label0.Caption := FindDragTarget(Mouse.CursorPos, True).Name;
//********************************************
{
//***********Mr.XRAY さんの回答を参考 *********************
//マウス位置の取得
GetCursorPos(P);
//コンポーネント名取得
Comp := FindDragTarget(P, True);
if Comp <> nil then
begin
if Comp.Name='WebBrowser1' then
begin
Label0.Caption:=Comp.Name;
end
else
if Comp.Name='WebBrowser2' then
begin
Label0.Caption:=Comp.Name;
end
else
begin
Label0.Caption:='';
end;
end
else
Label0.Caption:='';
//********************************************************
}
end;
//Label0.Caption:= マウスカーソル直下のWebBrowser名
//Label1.Caption:= WebBrowser1に表示しているフォルダパス
//Label2.Caption:= WebBrowser2に表示しているフォルダパス
function MouseProc(nCode: Integer; wParam, lParam: Longint): Longint; stdcall;
var
Str : String;
ItemCount : Integer;
hListView : HWND;
procedure FileNameGet;
var
iState : Integer;
i : Integer;
mask : Integer;
pszText : array[0..255] of AnsiChar;
begin
mask := LVIS_SELECTED;
for i:=0 to ItemCount-1 do
begin
iState := ListView_GetItemState(hListView,i,mask);
if (iState and LVIS_SELECTED)<>0 then
begin
ListView_GetItemText(hListView,i,0,pszText,SizeOf(pszText));
Str:= pszText;
break;
end;
end;
end;
var
szClassName : array[0..255] of Char;
begin
if (nCode < 0) then
begin
Result := CallNextHookEx(HookID, nCode, wParam, lParam);
exit;
end;
if (wParam = WM_LBUTTONDBLCLK) then
begin
if Form1.Label0.Caption='WebBrowser1' then
begin
hListView := FindChildOfClass(Form1.WebBrowser1.Handle,LV_Name);
end
else
if Form1.Label0.Caption='WebBrowser2' then
begin
hListView := FindChildOfClass(Form1.WebBrowser2.Handle,LV_Name);
end
else
begin
Result := HC_SKIP;
exit;
end;
ItemCount := ListView_GetItemCount(hListView);
GetClassName(PMOUSEHOOKSTRUCT(lParam)^.HWND,szClassName,SizeOf(szClassName));
if lstrcmp(@szClassName[0], @LV_name[1]) = 0 then
begin
FileNameGet;
if Form1.Label0.Caption='WebBrowser1' then
begin
str:=Form1.Label1.Caption+'\'+str;
Form1.memo1.Lines.Add(str);
end
else
if Form1.Label0.Caption='WebBrowser2' then
begin
str:=Form1.Label2.Caption+'\'+str;
Form1.memo1.Lines.Add(str);
end;
Result := HC_SKIP;
exit;
end;
end;
Result := CallNextHookEx(HookID, nCode, wParam, lParam);
end;
ありがとうございました。
ご報告まで。
ツイート | ![]() |