簡體   English   中英

Visual Studio 擴展鼠標按鈕事件不起作用

[英]Visual Studio Extension Mouse Button events not working

我有一個帶有(異步)工具 window 的 Visual Studio 擴展。 工具 window 有一個UserControl ,並且該控件有一個Image ,我使用WriteableBitmap作為源。 基本上,我正在嘗試在工具 window 上使用圖形 API (Vulkan)。

基本上,我的擴展可能看起來類似於 Visual Studio 的 3d model 編輯器。

我的問題是,當我單擊工具 window 時,不會調用像MouseLeftButtonDownPreprocessMouseLeftButtonDown這樣的鼠標事件處理程序。 我嘗試向UserControlImage甚至HwndHost添加鼠標事件處理程序,但沒有成功。

我知道IMouseProcessor或其他變體,但在我看來,它們用於文本編輯器,而不僅僅是工具 window 窗格或用戶控件。

HwndHostWndProc方法似乎也沒有接收到任何鼠標事件。 簡單地通過替換父 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);
}

我還沒有弄清楚如何使用ImageUserControl處理鼠標輸入,但我已經為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM