WPF Win10 Отключить автоигру - PullRequest
0 голосов
/ 01 мая 2018

Моя программа захватывает, когда USB-устройства подключены / отключены и делает то, что должна.

Есть одна неприятная вещь: проводник открывает окно. Угадай, авто-игра является виновником. Полностью отключить автоматическое воспроизведение на этом компьютере невозможно, поэтому его следует отключить только во время работы приложения.

Я нашел множество статей о том, как сделать это, захватив сообщение Windows. Который пускает в следующий код, который компилируется и запускается по прибытии сообщений Windows. Но, к сожалению, QUeryCancelAutoPlay, кажется, никогда не вызывается.

protected override void OnSourceInitialized(EventArgs e)
{
   base.OnSourceInitialized(e);
   HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
   source.AddHook(WndProc);
}

private UInt32 queryCancelAutoPlay = 0;

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern uint RegisterWindowMessage(string lpString);


private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    if (queryCancelAutoPlay == 0)
    {
       queryCancelAutoPlay = RegisterWindowMessage("QueryCancelAutoPlay");
    }

    if (msg == queryCancelAutoPlay)
    {
        return (IntPtr)1;
    }
    return IntPtr.Zero;
  }

Есть мысли? Я разработал это на машине win10.

1 Ответ

0 голосов
/ 12 октября 2018
public partial class MainWindow : NavigationWindow
    {
        public int queryCancelAutoPlay = 0;
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern int RegisterWindowMessage(string lpString);

        public MainWindow()
        {
            InitializeComponent();
        }


        protected override void OnClosing(CancelEventArgs e)
        {
            base.OnClosing(e);
            MainWindow_Closing(this, e);
        }

        protected override void OnSourceInitialized(EventArgs e)
        {
            base.OnSourceInitialized(e);
            MainWindow_SourceInitialized(this, e);
        }

        private void MainWindow_SourceInitialized(object sender, EventArgs e)
        {
            Debug.WriteLine("Initialize MainWindow");
            IntPtr windowHandle = (new WindowInteropHelper(this)).Handle;
            HwndSource src = HwndSource.FromHwnd(windowHandle);
            src.AddHook((WndProc));
        }

        private IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            //if the QueryCancelAutoPlay message id has not been registered...

            if (queryCancelAutoPlay == 0)
            {
                queryCancelAutoPlay = RegisterWindowMessage("QueryCancelAutoPlay");
                Debug.WriteLine("cancel autoplay registered. msg id: " + queryCancelAutoPlay.ToString());
            }
            //if the window message id equals the QueryCancelAutoPlay message id
            if (msg == queryCancelAutoPlay)
            {
                Debug.WriteLine("Autoplay cancelled");
                queryCancelAutoPlay = 0;
                handled = true;
                return new IntPtr(1);
            }
            return new IntPtr(msg);

        }

        private void MainWindow_Closing(object sender, CancelEventArgs e)
        {
            Debug.WriteLine("Close MainWindow");
            HwndSource source = (HwndSource)HwndSource.FromVisual(this);
            source.RemoveHook(new HwndSourceHook(this.WndProc));
        }

    }
...