Webbrowser1と2のダブルクリックされた方の判別

解決


武田  2013-05-25 02:57:57  No: 44570

皆様よろしくお願いします。環境は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;


  2013-05-25 03:34:12  No: 44571

無理やりやるなら、こんな感じかと。

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if Msg.message = WM_LButtonDown then
    Caption := FindDragTarget(Mouse.CursorPos, True).Name;
end;


Mr.XRAY  URL  2013-05-25 08:36:56  No: 44572

やっていることはよく分かりませんが,
マウスフックを使用しているのであれば,フックのコールバック関数の引数から
マウス座標が取得できます.この座標値で判定できるような気がしますが.
マウスの座標値は,GetCursorPos 関数でも取得できます.

[MouseProc 関数]
http://msdn.microsoft.com/ja-jp/library/cc429978.aspx


Mr.XRAY  URL  2013-05-25 18:23:52  No: 44573

>サムネイルをダブルクリックしたフルパスを取得したい

ということでしたら,ダブルクリックを検出すればいいので,
TApplicationEvents(Additionalタブ) コンポを使用した例です.
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=1177.0

Delphi 6 Personal 版で使えるかどうかは分かりません.
Personal 版を使いこなしている方もいるようですので,
そちらからの情報提供を期待してください.


武田  2013-05-25 21:07:53  No: 44574

あさん、Mr.XRAY さん  ご返事ありがとうございます。
これから、皆様のアドバイスをもとに試みてみます。
2個置いたときの挙動がかなり変化するので
あるいは無理矢理する、またマウスポジションから判別する
など非常にヒントになりました。私でも、いけるかもという気がします。

レベルが低いため、試行錯誤に時間をとりますから
一応、解決としてこの質問をクローズしておきます。
結果はまたお知らせします。
ありがとうございました。


武田  2013-05-25 23:17:07  No: 44575

あさん、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;
ありがとうございました。
ご報告まで。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加