[英]Visual Studio Extension Mouse Button events not working
我有一個帶有(異步)工具 window 的 Visual Studio 擴展。 工具 window 有一個UserControl
,並且該控件有一個Image
,我使用WriteableBitmap
作為源。 基本上,我正在嘗試在工具 window 上使用圖形 API (Vulkan)。
基本上,我的擴展可能看起來類似於 Visual Studio 的 3d model 編輯器。
我的問題是,當我單擊工具 window 時,不會調用像MouseLeftButtonDown
或PreprocessMouseLeftButtonDown
這樣的鼠標事件處理程序。 我嘗試向UserControl
、 Image
甚至HwndHost
添加鼠標事件處理程序,但沒有成功。
我知道IMouseProcessor
或其他變體,但在我看來,它們用於文本編輯器,而不僅僅是工具 window 窗格或用戶控件。
HwndHost
的WndProc
方法似乎也沒有接收到任何鼠標事件。 簡單地通過替換父 Hwnd 的 WndProc 來“取悅”它似乎可行,但我不想創建一個控制整個 Visual Studio 的擴展。
== 編輯 ==
public partial class MyControl : UserControl {
public MyControl () {
InitializeComponents ();
MouseLeftButtonDown += MyLeftButtonDown;
}
...
private void MyLeftButtonDown (object sender, MouseButtonEventArgs e) {
// This code never gets executed.
}
}
也不是這些。
<UserControl ...
IsHitTestVisible="True"
MouseLeftButtonDown="MyLeftButtonDown ">
<Image x:Name="View" ... />
<!--- nor this --->
<!--- <Image x:Name="View" MouseLeftButtonDown="MyLeftButtonDown " /> --->
</UserControl>
這也行不通。
public partial class MyControl : UserControl {
public MyControl () {
InitializeComponents ();
// View is an object of Image class.
View.MouseLeftButtonDown += MyLeftButtonDown;
}
...
private void MyLeftButtonDown (object sender, MouseButtonEventArgs e) {
// This code never gets executed.
}
}
// C++/CLI
IntPtr MyHost::WndProc (IntPtr hWndPtr, int uMsg, IntPtr wParamPtr, IntPtr lParamPtr, bool % handled)
{
auto hWnd = (HWND) hWndPtr.ToPointer ();
auto wParam = (WPARAM) wParamPtr.ToPointer ();
auto lParam = (LPARAM) lParamPtr.ToPointer ();
switch (uMsg)
{
case WM_LBUTTONDOWN: // This doesn't get called.
break;
...
default:
handled = false;
return IntPtr (DefWindowProc (hWnd, uMsg, wParam, lParam));
}
...
handled = true;
return IntPtr (0);
}
我還沒有弄清楚如何使用Image
或UserControl
處理鼠標輸入,但我已經為HwndHost
弄清楚了。
顯然,如果您的HwndHost
沒有回復WM_NCHITTEST
,那么您的HwndHost
將永遠不會收到任何鼠標事件,例如WM_LBUTTONDOWN
。
// C++/CLI
IntPtr MyHost::WndProc (IntPtr hWndPtr, int uMsg, IntPtr wParamPtr, IntPtr lParamPtr, bool % handled)
{
auto hWnd = (HWND) hWndPtr.ToPointer ();
auto wParam = (WPARAM) wParamPtr.ToPointer ();
auto lParam = (LPARAM) lParamPtr.ToPointer ();
switch (uMsg)
{
case WM_NCHITTEST: // This message.
SetFocus (hWnd);
handled = true;
return IntPtr (HTCLIENT);
case WM_LBUTTONDOWN: // This works now.
break;
...
default:
handled = false;
return IntPtr (DefWindowProc (hWnd, uMsg, wParam, lParam));
}
...
handled = true;
return IntPtr (0);
}
然后,您可以放置一些委托或事件,並為WndProc
消息調用它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.