Microsoft Foundation Classes フレームワーク (MFC) で C++ を使用する AutoCAD プラグインを作成し、AutoCAD に関連付けられた ObjectARX ソース ライブラリをリンクして、プラグインを AutoCAD のネイティブ コードと統合するのに役立てています。
現在、ピンチ、ズーム、パンなどのタッチスクリーン ジェスチャを使用したときに作成される Windows メッセージをインターセプトできないという問題が発生しています。
これは、以下で実装したフック メソッドの例です。基本的にすべてのマウス イベント (左クリック ダウン、左クリック アップ、マウス ホイール、右クリック、ダブルクリックなど) を受け取ることができます。問題は、タッチスクリーンで指を使ってピンチやズーム、2 本指のパンなどのジェスチャを実行すると、Windows メッセージがこのフックに転送されないことです。WM_GESTURE または WM_TOUCH メッセージもこのフックによって傍受されていると想定していました。
ただし、図面を含む AutoCAD のメイン フレーム ウィンドウは、私が作成しているこれらのジェスチャ アクションに引き続き応答します。つまり、指でピンチ、ズーム、およびパンしながら、AutoCAD のネイティブのズームおよびパン機能を使用できます。私が今抱えている問題は、このデフォルト機能をブロックまたは変更する必要がある場合に、これらのジェスチャ イベントを傍受または変更する方法がないことです。
BOOL WindowsMessageHook(MSG *pMsg)
{
if (pMsg->message == WM_LBUTTONDOWN)
{
//Got Left Click (This works!)
}
else if (pMsg->message == WM_TOUCH)
{
//Try to intercept WM_TOUCH (Doesn't work)
return TRUE;
}
else if (pMsg->message == WM_GESTURE)
{
//Try to intercept WM_GESTURE (Doesn't work)
return TRUE;
}
return FALSE;
}
呼び出される別のメソッドには、フックを ObjectARX に登録する次のコード行があります。
acedRegisterFilterWinMsg(WindowsMessageHook);
Windows メッセージをインターセプトする透明なウィンドウをシミュレートするコードをいくつか書いてみました (同様の質問をしている他の人に提案されているように)。残念ながら、少なくとも私が試したコードでは、これらの種類の Windows メッセージ (WM_GESTURE / WM_TOUCH) を傍受できませんでした。
これらのメッセージを取得するために何か特別なことをする必要があるかどうか疑問に思っています。または、根本的に何かを理解していないだけで、この問題に対処する方法が完全に間違っている可能性があります。
私が思いついた別の潜在的な解決策のアイデアは、AutoCAD のメイン フレーム「Wnd」(ウィンドウ) クラスをオーバーライドする方法を見つけ、特に「WndProc」メソッドをオーバーライドする方法を見つけることでした。他の同様の提案をオンラインで見たからです。問題は、ObjectARX でそれを適切に行う方法が正確にわからないことです。以下のコード行を使用すると、メイン フレーム ウィンドウを取得できると思います。
CMDIFrameWnd* acadWindowFrame = acedGetAcadFrame();
注: Windows 10 マシンのみを対象としています。
この問題に頭を悩ませようとしてかなりストレスを感じていたので、洞察や助けは非常に高く評価されており、この時点では時間を無駄にしているように感じます。
お時間とご尽力いただき、誠にありがとうございました。