C# WPF-无焦点滚动

C# WPF-无焦点滚动,c#,wpf,winapi,focus,scrollviewer,C#,Wpf,Winapi,Focus,Scrollviewer,我想在应用程序窗口未聚焦时滚动ScrollViewer控件。我在Windows窗体中找到了一些解决方案,但在WPF中没有,因为我需要的一些东西不可用 也许这里有人能帮我解决问题 提前谢谢 编辑: 我想在鼠标悬停在ScrollViewer上时使用鼠标滚轮滚动ScrollViewer控件,但也要在应用程序窗口未聚焦时进行滚动。我找到了一个解决方案。这里有一个例子: XAML <Window x:Class="Project.MainWindow" xmlns="http://schemas.m

我想在应用程序窗口未聚焦时滚动ScrollViewer控件。我在Windows窗体中找到了一些解决方案,但在WPF中没有,因为我需要的一些东西不可用

也许这里有人能帮我解决问题

提前谢谢

编辑:


我想在鼠标悬停在ScrollViewer上时使用鼠标滚轮滚动ScrollViewer控件,但也要在应用程序窗口未聚焦时进行滚动。

我找到了一个解决方案。这里有一个例子:

XAML

<Window x:Class="Project.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="300" Width="500">
    <ScrollViewer x:Name="ScrollViewer">
        <StackPanel>
            <Border Background="Blue" Width="100" Height="100" />
            <Border Background="Red" Width="100" Height="100" />
            <Border Background="Blue" Width="100" Height="100" />
            <Border Background="Red" Width="100" Height="100" />
            <Border Background="Blue" Width="100" Height="100" />
            <Border Background="Red" Width="100" Height="100" />
        </StackPanel>
    </ScrollViewer>
</Window>

您想以编程方式滚动
ScrollViewer
,还是希望用户即使不是前台窗口也能用鼠标滚动?请参阅我的编辑,我想它会回答您的问题。
using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Input;
using System.Windows.Interop;

namespace Project
{
    public partial class MainWindow : Window
    {
        private const int WH_MOUSE_LL = 14;
        private const int WM_MOUSEWHEEL = 0x020A;
        private delegate IntPtr LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam);

        private IntPtr _handle;

        public MainWindow()
        {
            InitializeComponent();

            _handle = new WindowInteropHelper(this).Handle;
            SetWindowsHookEx(WH_MOUSE_LL, MouseChanged, _handle, 0);

            ScrollViewer.PreviewMouseWheel += ScrollViewer_MouseWheel;
            Unloaded += MainWindow_Unloaded;
        }

        private void MainWindow_Unloaded(object sender, RoutedEventArgs e)
        {
            UnhookWindowsHookEx(_handle);
        }

        private void ScrollViewer_MouseWheel(object sender, MouseWheelEventArgs e)
        {
            e.Handled = true;
        }

        private IntPtr MouseChanged(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (ScrollViewer.IsMouseOver && WM_MOUSEWHEEL == (int)wParam)
            {
                MouseData mouseData = (MouseData)Marshal.PtrToStructure(lParam, typeof(MouseData));
                ScrollViewer.ScrollToVerticalOffset(ScrollViewer.VerticalOffset - mouseData.Z / 200000.0);
            }
            return CallNextHookEx(_handle, nCode, wParam, lParam);
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct MouseData
        {
            public int X;
            public int Y;
            public int Z;
        }

        [DllImport("user32.dll")]
        private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelMouseProc lpfn, IntPtr hMod, uint dwThreadId);

        [DllImport("user32.dll")]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);

        [DllImport("user32.dll")]
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
    }
}