BBS01186金魚鉢ホームページへ戻るご意見・ご要望ございましたらここに書き込みをお願いします。最近はあまり対応できていなくて申し訳ありません。マウスジェスチャについて。引用Windowfrogを愛用させていただいている者です。以下の点で悩んでおります。自作ツールが反応するより先に、元から表示されているウインドウでスクロールが行われてしまいます。�A上記の点については目を瞑ってそのまま処理を続行するも、左クリックや右クリックを離したことを検出する方法が分かりません。宜しければ、以下の二点について答えていただければと思います。掲示板で相応しくない話題であれば、メールで答えていただければと思います。マウスジェスチャについて。Windowfrogをご利用いただきありがとうございます。こちらで返信させていただきます。�@フックプロシージャでメッセージを処理した際に0以外の値を返すとそのメッセージをそこで止めることができます。これで他のウィンドウのスクロールを阻止できると思います。procedure.”http://msdn.microsoft.com/en-us/library/ms644988(v=VS.85).aspxそれでも上手くいかない場合は何らかの原因でグローバルフック自体に失敗している可能性も考えられると思います。�A左ボタン/右ボタンが離されたことを検出するにはそれぞれWM_LBUTTONUP/WM_RBUTTONUPというメッセージがあるので、それらを捕捉すれば可能です。お役に立てば幸いです。マウスジェスチャについて。回答ありがとうございます。1;と言った具合にスクロールを潰す事は試したのですが、その場合自作ツールのウインドウの方でもスクロールが動いてくれません。(これはwindowfrogの様に左クリック+ホイール操作を続けた場合のことであって、クリック操作を中断すれば勿論スクロールは可能です)�Aこれについても既に試しており、ツールのウインドウが表示される以前に押下した場合、WM_LBUTTONUPは自作ツール本体のウインドウプロシージャ及びDLLのフックプロシージャに飛んできませんでした。(WM_NCLBUTTONUPも同様)条件を後出し等と大変厚かましい行為をお許し下さい。回答宜しくお願いします。マウスジェスチャについて。自ウィンドウがみえている時のみ飛んでくるとなると、グローバルなフックが上手くいっていない可能性が高いと思いますよ。(実は自分でも経験あります(^^;自分的には、試しに最小の別プロジェクトで実験を行い、その後本体に組み込むというのがお薦めです。マウスジェスチャについて。引用C++のソースですが、プロシージャの処理は以下のような感じで簡易版が実現可能かと思います。マウスジェスチャについて。回答ありがとうございます。通常の右クリック操作に支障をきたす様です。(CallNextHookExすれば解決しました)しかし、wParamがWM_MOUSEWHEELかつbButtonDownがTRUEの条件のところまで来てくれないようです。(WM_RBUTTONDOWNやWM_RBUTTONUPのところには来てくれています)グローバルフックは他の条件(WM_MOUSEMOVEなど)で見る限り成功しているようです。何度も何度も申し訳ありませんが、宜しくお願いします。マウスジェスチャについて。以下の点についてお詫び申し上げます。先程の質問の原因は変数をstaticにするのを忘れているだけでした。「WM_RBUTTONUPのところには来てくれています」とありますが、実際の状況は以前の�Aから変化しておらず、いまだにこちらの原因は分かりません。先程は書き忘れたのですが、WM_HOOKMSG_WHEELは一体どのような処理を呼び出しているのでしょうか。SendInputで十字キーで良いのでしょうか。連投で申し訳ないですが、宜しくお願いします。マウスジェスチャについて。言葉で説明するにはお互い限界があるのでサンプル的なプロジェクトを作ってみました。http://molmott.hp.infoseek.co.jp/src/hook_test.lzhVisualStudio2010のプロジェクト形式になっています。笑)他のIDEをご使用の場合も、重要なのはHook.cpp(DLLのソース)とhook_test.cpp(呼び出し側のソース)のみですので、これらを見ていただければわかると思います。ちなみにMyRegisterClassやらInitInstanceやらの関数がいますがこれらはVisualStudioのWin32標準テンプレートの記述です。気にしないでください。見ていただくとわかるとおもいますが、このサンプルでは大して難しいことはやっていません。>また、先程は書き忘れたのですが、WM_HOOKMSG_WHEELは一体どのような処理を呼び出しているのでしょうか。これは実現したいことに応じて変わると思います。上記サンプルではウィンドウのサイズの変更を行っています。自ウィンドウに単純にスクロールとして認識させたい場合はWM_MOUSEWHEELを送る手もあると思います(その場合パラメータも作るべきかもしれません...)>TRUEを返すと、通常の右クリック操作に支障をきたす様です。これはTRUEを返して無効にしているので当然のことで、この点は上記サンプルでも同じです。そのうえでWindowfrogではWM_RBUTTONDOWNを受けた時にタイムアウト処理を行うスレッド作り、所定の時間内にホイールの回転が行われなかった場合はmouse_event関数を使って擬似的に無効にした右ボタン押下を再現しています。記述が込み入るためこの処理は省きました。マウスジェスチャについて。回答有難う御座います。お陰で上記の問題を解決する事が出来ました。マウスジェスチャについて。何が原因でしたか??タイムアウト処理ですがWaitForSingleObject関数でいけますよ。マウスジェスチャについて。原因はSetWindowsHookExのフックタイプが誤っていた事でした。スレッドについてですが、「イベント」なるものをなかなか理解できず、今尚前回の投稿より進歩していません。宜しければ助言を頂けないでしょうか。マウスジェスチャについて。引用たいして詳しいわけではないので、自分なりの解釈で説明させていただきます。イベントとは要はON・OFFを示すグローバル変数です。・CreateEvent関数で任意の名前を持つイベントを作成できます。・作成したイベントはOpenEvent関数で名前を指定することで複数のスレッドからアクセスできます。・SetEvent関数・ResetEvent関数でイベントの状態を変更できます。WaitForSingleObject関数は所謂待機関数というもので、指定時間が経過するか、指定されたイベントがONになると処理を返すというものです。以下のサイトの説明が分かりやすいと思うのでこちらを是非ご参考に。・フック側は�@マウスボタンが押されたらスレッドを開始する。・スレッド側は�@WaitforSingleObject関数で待機。�BイベントをOFFにするというような感じでしょうか。マウスジェスチャについて。回答有難う御座います。なんとかイベントの方を理解することが出来、終わりまであと少しなのですが、以下の問題が発生しています。�@WaitForSingleObjectの適切なタイムアウト値が分かりません。環境のせいか、例えば1000msとすると、それ毎にマウスの動きが少し止まってしまいます。�Amouse_eventやSendInputが届きません。MessageBoxで確認する限り、mouse_event手前までは来ているのですが、肝心のマウスのクリックが出来ません。mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);とするだけで出来ると思っているのですが、違うのでしょうか。マウスジェスチャについて。環境のせいか、例えば1000msとすると、それ毎にマウスの動きが少し止まってしまいます。この点ですがマウスの動きが止まるということは、並行処理ができていないということなので、スレッドの作成に失敗しています。ちなみに、Windowfrogは初期値は500msになっています(実は設定で変更できたりもします。�Amouse_eventやSendInputが届きません。mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);であっていると思います。先ほど書き忘れましたがmouse_eventで合成したメッセージもフックプロシージャに届くので、場合によってはそれも考慮して処理を組む必要があります。マウスジェスチャについて。引用>mouse_eventで合成したメッセージもフックプロシージャに届くので、場合によってはそれも考慮して処理について、以下のようなグローバル変数を使用した簡単な切り替えを試してみました。TRUE;}すると、クリックが効いたかと思いきや、500ms毎にクリック操作が繰り返されてしまうようです。これはスレッドの作成が失敗しているからなのでしょうか。マウスジェスチャについて。�@CloseHandleがその位置にあるのはまずい気がします。スレッドが終了してからハンドルを閉じるべきだと思います。今回の場合スレッドの終了を待っているわけでないのでどう閉じるべきか...自分の場合はハンドルを閉じる必要がない_beginthreadを使ってたりします。�Aクリックが繰り返されるのは、タイムアウトでクリックを合成する→プロシージャにWM_LBUTTONDOWNが飛んでくる→またスレッドを作っている→・・・・となってしまっているからだと思います。CallNextHookEx(g_hMouseHook,nCode,wParam,lParam);この行をCreateThreadの前に置くと上手くいくと思います。マウスジェスチャについて。回答有難う御座います。�@�A共に修正し、色々と試しているのですが、前へと進むことが出来ません。助言を頂けないでしょうか。マウスを離した際の処理についてお願いします。マウスジェスチャについて。たくさんの実現方法があると思うので一概には言えないのですが...考えられる方法としてWM_*BUTTONUPの際の処理は、「タイムアウト前」の場合と「ボタン押下&&ウィンドウ表示中」の場合の2つに分けて処理するといいと思います。TRUEといった感じでしょうか。マウスジェスチャについて。上述のような場合分けを使うならば、WM_*BUTTONUP時にボタン押下フラグを折ってさえおけばタイムアウト時にはこの処理は素通りしてくれるので、タイムアウト時にはUPを合成する必要はないです。マウスジェスチャについて。引用>WM_*BUTTONUPの際の処理は、「タイムアウト前」の場合と「ボタン押下&&ウィンドウ表示中」の場合の2つに分けて処理するについて、以下のようなコードで良いのでしょうか。if(bVisible){PostMessage(hwndTarget,WM_HOOKMSG_HIDE,0,0);bVisible=FALSE;}else{SetEvent(hEvent);bClick=TRUE;mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);bClick=FALSE;}また、>WM_*BUTTONUP時にボタン押下フラグを折ってさえおけばタイムアウト時にはこの処理は素通りしてくれるので、タイムアウト時にはUPを合成する必要はないです。部分をもう少し詳しく説明していただけないでしょうか。ちなみに、>ボタン押下フラグと言うのは、bButtonDownの事であると勝手に解釈していますのでご注意ください。読解力が乏しくて申し訳ないです。マウスジェスチャについて。以下のようなコードで良いのでしょうか。WM_RBUTTONDOWNでTRUEを返してメッセージを止めていると思うので、スレッドを停止したのちRIGHTUPを合成する前にどこかでRIGHTDOWNを合成する必要があると思います。あとbButtonDownも考慮してほしいです。詳しく説明していただけないでしょうか。ボタン押下フラグはサンプルでいうところのbButtonDownのつもりでした。言わんとしたことは上のコードだとスレッド内の処理で�@タイムアウトする�ARIGHTDOWNとRIGHTUPを合成する�Bスレッド終了という流れになりますが、現実のマウスボタンはまだ押されたままになっていて、それを離したときもプロシージャにWM_RBUTTONUPが飛んできますのでWM_RBUTTONUPが二重になってしまう...ということでした。仮に先ほどの場合分けをすれば(bButtonDownがFALSEであればどちらにも該当せずメッセージはそのまま素通りすることになるので)、スレッドの�Aの段階でbButtonDownをFALSEにしておけばタイムアウト時の処理ではRIGHTUPを合成する必要はないです。笑>WM_*BUTTONUP時にボタン押下フラグを折ってさえおけばタイムアウト時にはこの処理は素通りしてくれるので、タイムアウト時にはUPを合成する必要はないです。この文章は明らかにおかしかったです。自分の日本語能力が限界なのでコードで書きます。マウスジェスチャについて。引用やはりファイルをアップしました。サンプルのHook.cppを置き換えていただくだけで大丈夫だと思います。http://molmott.hp.infoseek.co.jp/src/Hook.cppbClickのスキップ処理を少しいじりましたが、この方が安全かな?という程度です。今気付きましたがドロップ操作が駄目ですね...WM_*BUTTONDOWNのときにカーソルの座標をグローバル変数に保持しておき、mouse_event時に元に戻せば上手くいきます。マウスジェスチャについて。今スキップ処理の部分を微妙に修正しました(^^;)ほんと、ぐだぐだですみません。マウスジェスチャについて。回答有難う御座います。>WM_*BUTTONDOWNのときにカーソルの座標をグローバル変数に保持しておき、mouse_event時に元に戻せば上手くいきます。ことですので、WM_LBUTTONDOWNでGetCursorPos(&pt);WM_LBUTTONUPでmouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);SetCursorPos(pt.x,pt.y);mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);としてみたのですが、選択は出来るものの、ドラッグアンドロップが出来ないようです。本当に何度も何度も申し訳ないです。これ以外はアップロードしてくれましたコードのお陰で正常に動作している為、おそらくこれが最後の質問になるかと思われます。マウスジェスチャについて。してみたのですが、選択は出来るものの、ドラッグアンドロップが出来ないようです。WM_MOUSEMOVE等WM_*BUTTONUP以外のメッセージが飛んできた場合も復元作業(?)をするように変更しました。(ただしこれをやると判定がシビアになってしまうのですが...http://molmott.hp.infoseek.co.jp/src/Hook.cpp微妙にプロシージャの処理が変わっていますが、以前のものを修正した後、まとめただけです。mouse_eventは古いと書かれていたのでSendInputに置き換えました。(無駄な構造体が増えただけだと思っていたのですが、実は引数の精度が上がってました。)グローバル変数ptButtonDownを用意し、WM_*BUTTONDOWNの処理時にそこに座標を格納しています。マウスジェスチャについて。回答有難う御座います。選択が出来ないようです。(何度か修正を試みるも残念ながら...)今度こそ最後の質問となるはずです。マウスジェスチャについて。選択とはデスクトップ等でアイコンを複数選択するもののことですよね?再度確認しましたが、以前のサンプルのHook.cppを今回のHook.cppの内容に置き換えただけですが、特に自分の環境では問題はないようです...どの段階で失敗しているようですか?ご確認よろしくお願いします。マウスジェスチャについて。押下後、少し待ってからであれば可能でした。マウスジェスチャについて。引用>押下後、少し待ってからについてはWM_MOUSEMOVEで処理を追加すれば何とかなりそうです。毎日Windowfrog使用させてもらっています。今回久しぶりに更新させてもらいましたが、以前はあったタイトルを指定して無視をする機能がなくなっていませんか?自分は結構使っていたので、復活してもらえるとうれしいのですが...。引用Windowfrogをご利用いただきありがとうございます!ご指摘の通り1.20を作った時(多分)にタイトル指定で除外する機能を省きました。ウィンドウを選別する処理が稚拙で、スタートメニュー等までも列挙してしまっていたための苦肉の策でしたが、現行のバージョンではほぼAlt+Tabを再現できるようになったためです。(笑ですが、ご利用いただいていた方がいらっしゃったということで設定画面を省略した形で復活させました。かわりにさくっと簡易のツールを用意しましたのでこちらを本体と同じフォルダに置いて実行してみてください。http://molmott.hp.infoseek.co.jp/windowfrog/ExcludeWnd.lzhちなみにこちらはC#で作ったので.netの実行環境が必要です。無茶なお願いを聞いていただきありがとうございました。本当に感謝しています。引用ずーぅっと使っています。あげたら動かなくなったので、金魚鉢殿に久々訪問したところ、新バージョンがあったようです。上書きしたら問題なく動きました。ありがとうございます。小窓が選べない件、まだダメですね。�Cまた当該ソフトの設定状況も合わせてお教え頂けるとスムーズにお答えできると思います。なんだか質問攻めになってしまって申し訳ありません。(^^;以上4点よろしくお願いします。初めまして、いつもWindowfrogを利用させて頂いております。指定したウィンドウを閉じるという動作を追加できないでしょうか?ご検討のほど宜しくお願い致します。引用Windowfrogをお使いいただきありがとうございます。具体的にどのように追加すればいいかアイディアが浮かびません...クリックモードならばウィンドウ名の横に閉じるボタンをつければいいのですが、通常モードの時にどうすればいいか...なにかよいアイディアございましたらお願いします。返信有難うございます。対応していただけたみたいで、とても嬉しいです。要望内容に1点間違いがあることに気が付きました。追加してほしい機能は「指定したウィンドウを閉じる」ではなくて、「現在アクティブなウィンドウを閉じる」です。”Ctrl+Wを代替してもらいたい”と言うのが本当の要望でした。誤解を招くような記述をしてしまい、申し訳ございません。上記の場合で提案いたしますが、通常モードの場合ですとwindowfrogのオプションで「デスクトップの表示/非表示」と「キャンセル」が設定できるようになっていると思いますが、そこに「現在アクティブのウィンドウを閉じる」というのを追加するというアイデアはダメでしょうか。ご検討のほど、宜しくお願い致します。引用ご提案ありがとうございます。機能を追加したWindowfrog1.207を公開しました!仕様としては前回アクティブだったウィンドウに対して閉じるボタンを押したよ的なメッセージを送っています。閉じるボタンがない等のそのソフトの仕様によっては上手くいかない場合もあるかもしれませんがご了承ください。管理人様へすぐに新しいWindowfrogを試して見ました!凄いです、思ったとおりの動きです!わがままな要望に応えていただき、本当に有難うございました。今後もWindowfrogを使わせていただきます。見つけ使用してすぐに気に入り、スタートアップに登録させていただきました。編集しているときに気がついたのですが、セルの端を右クリックしてドラッグすることができなくなるようです。引用Windowfrogをご利用いただきありがとうございます。手持ちの環境(Excel2007&7)では再現できませんでした。(もっとも普段Excelをあまり使わないため何か見落としがあるかもしれませんが...)ただ、Windowfrogは擬似的にマウス操作を発生させていますので一部のソフトウェア上では上手く動作しない可能性もあると思われます。その場合、マウスフックを一時的に無効にする機能がありますので申し訳ありませんがそちらをご利用ください。=)ありがとうございます。励みになります!これからもよろしくお願いします。引用こんにちはいつも利用させてもらっています。環境の方はVistaなので問題ないと思ったのですが、サムネイル表示ができるということを知り,design.iniの"thumbnail"を1にしたのですが、サムネイルが表示されません。拙作をご利用頂きありがとうございます。配色の変更はdesign.iniという名前のファイルが本体と同じフォルダにあった場合にそれを読み込みます。付属のサンプルを流用する場合はサンプルファイルの名前をdesign.iniに変更してみてください。携帯からの投稿のため改行など読みにくくなっていたらすみません(>_<)よろしくお願いします。引用はじめまして、Windowfrogを今日知り、早速使わせて頂いています。1点要望なのですが、Windows7での標準の画面切り替え(Alt+Tab)では、切り替えるウィンドウを選択中にそのウィンドウが一番手前に来て、他の選択していないウィンドウは枠だけ残り非表示となります。Windowfrogでもこの仕様にはできないでしょうか?または、今のWindowfrogでの切り替える一覧リストに表示されるウィンドウのアイコンを、Windows7と同様に現状のウィンドウの状態のサムネイルにすることはできないでしょうか?Windowfrogでウィンドウを切り替える際、エクスプローラがいくつも起動していると、パスを読み取って選択する必要があります。Windows7の切り替えでは対象のウィンドウだけ表示されたりサムネイルである程度識別できるので楽です。引用Windowfrogをご利用いただきありがとうございます。不可能ではないだろう&おもしろそうというノリと勢いで作ってしまいました。枠を自前で描画したりと結構がんばったのですが、ウィンドウを選択したときにどうしてもちらつく&もたついてしまいます...また、フォーカスが移ってしまうのでクリックモードとの並立は無理でした。・選択中のウィンドウ以外を枠表示にする機能はオプション→全般→にチェックボックスがあります。方法として最小化と非表示を用意しました(前者はアニメーションがうざい、後者はサムネイルが消える&タスクトレイがひどい&危ない気がする(?)と一長一短な感じです)・サムネイルはdesign.iniの[Item]セクション"thumbnail"を1に指定してください。ちなみにDWMを使っているのでAero搭載のVista以降でしか動作しません。サムネイルのサイズは同セクション"icon-size"で変更できます。このような感じでいかがでしょうか?ご感想お聞かせいただけると幸いです。対応ありがとうございます!すばらしいです!個人的には最小化モードのアニメーションがお気に入りです^^サムネイルもとても良い感じです。アイコンに隠れてしまうのがちょっと残念です。icon-size=64ぐらいにするとサムネイルの6割ぐらい見えるようになりましたが^^;もたつきですが、やっぱりサムネイルを有効にすると、ほんのわずかもたつきますね。視認による選別時間が短縮されることを考えると、私としては全然許容範囲内です。・マウス操作でできる・デザインのカスタマイズができる・ランチャー機能があるといったところに魅力を感じます。・画面切り替えのアイコン(サムネイル)とは別に、ランチャーのアイコンサイズを指定できるように・ランチャーに登録したプログラムのアイコンを任意に変更できるようになると嬉しいです。引用ご感想ありがとうございます。>特に1つめはスペースを節約するためにもぜひ・・・><これはスペース節約のためにも見栄えのためにも確かに必要ですね。^^b以下の修正を加えWindowfrogを更新しました。・アイコンの読み込み方法修正(256×256アイコンも表示可能に)ちなみに実行ファイルのサイズが突然大きくなりましたが、これは「キャンセル」「デスクトップ表示・非表示」のアイコンに256×256の32ビットファイルを追加したためです。素早い対応ありがとうございます!早速設定し使わせて頂いております。なんどもすいませんが、追加で2点気になる点を挙げます。(1)デスクトップ表示/非表示について。デスクトップ表示/非表示を選択後、すべてのウィンドウが最小化されてデスクトップが表示されるのはわかりますが、その状態でもう一度デスクトップ表示/非表示を選択した場合、最小化されたウィンドウが復元するのかなと思っていましたが、何も変化はありませんでした。(それが”非表示”を示すのかなと・・・)これは正常な動きでしょうか?(2)標準のWindowsの切り替えと比較し、画面切り替えのウィンドウの並びが違うのが気になります。アクティブ化したウィンドウ順がFirefox:AExplorer:AFirefox:BExplorer:Bだったとすると(Firefox:Aが現在アクティブ)、Windows標準ではAlt+Tabを1回実行すればFirefox:AからExplorer:Aに切り替わります。Windowfrogの場合だとリストに表示される順はFirefox:AFirefox:BExplorer:AExplorer:Bとなります。同じプログラムはグルーピングされてるようなのですが、この仕様は何か意図があるんでしょうか?個人的には、Windows標準と同じようにアクティブ順に並べたほうが、直前のアクティブウィンドウに切り替えやすいと思います。Windows標準なら何も考えずAlt+Tab1回の実行で必ず直前のウィンドウに切り替わりますし、Windowfrogでもリストの2番目に直前のアクティブウィンドウ(例でいうならExplorer:A)が2番目にきてほしいです。アクティブウィンドウの順がツール側で変えられると、画面切り替え時に探さなくてはいけないので・・。言ってすみませんが、ご検討お願いします。引用ご意見ありがとうございます。(1)デスクトップ表示/非表示について。ウィンドウズの機能を呼び出していただけだったので最小化とかをこちらがしてしまうと意図したとおりに動かなくなってしまいますね...ということで自分で実装して対処しました。(2)標準のWindowsの切り替えと比較し、画面切り替えのウィンドウの並びが違うのが気になります。自分でも忘れ去っていたためどこにも書いてありませんが、実はプロセスごとにウィンドウをまとめる操作を行っていました。そのほうが個人的には見易かったので...今回、この操作を行わないようにできるようにしました。設定ファイルのPreferenceセクションにArrangeWindow=0という記述を追加してください。これでzオーダー順に並ぶはずです。陰ながら見守らせて頂きたいと思います。ありがとうございました。23:54:09以下のフォームに記事No.と投稿時のパスワードを入力すれば投稿後に記事の編集や削除が行えます。