Прозрачная форма необъяснимо пропускает только некоторые сенсорные вводы - PullRequest
1 голос
/ 25 июня 2019

У меня проблемы во время работы, когда я беру свой ноутбук, и, поскольку экран занимает почти всю площадь верхней части ноутбука, моя рука в конечном итоге касается экрана и часто сворачивает или закрывает программу.Я работаю с.Чтобы исправить это, я создал небольшую программу, которую я использую для «отключения» сенсорного экрана на моем ноутбуке, что вызвано отсутствием в Windows 10 опции отключения вне диспетчера устройств (в Windows 7 вы могли просто использовать настройки мыши -на win10 этот вариант пропал).

Программа работает хорошо, по существу идентифицируя и отбрасывая вводы мыши, идентифицированные как касания, но имеет странную причуду в том, что несколько окон все еще получают сенсорные вводы, такие как Edge и Chrome.Большинство программ не имеют этой проблемы, и программа обычно корректно сбрасывает сенсорные вводы.Это не большое дело, но мне интересно, почему эти окна все еще получают входные данные, а другие нет.

Я прикрепил код (он маленький), кто-нибудь знает, почему некоторые программы все еще получают эти входные данные?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Windows.Input;

namespace TouchDisable
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Width = Screen.PrimaryScreen.Bounds.Width;
            Height = Screen.PrimaryScreen.Bounds.Height;
            _hookID = SetHook(_proc);
        }
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            UnhookWindowsHookEx(_hookID);
        }


        //------------------------------------------------------------------------------------------
        private static LowLevelMouseProc _proc = HookCallback;
        private static IntPtr _hookID = IntPtr.Zero;

        private static IntPtr SetHook(LowLevelMouseProc proc)
        {
            using (Process curProcess = Process.GetCurrentProcess())
            using (ProcessModule curModule = curProcess.MainModule)
            {
                return SetWindowsHookEx(WH_MOUSE_LL, proc,
                    GetModuleHandle(curModule.ModuleName), 0);
            }
        }

        private delegate IntPtr LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam);

        private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (IsTouch(lParam))
                return new IntPtr(1);
            else
                return CallNextHookEx(_hookID, nCode, wParam, lParam);
        }

        private const int WH_MOUSE_LL = 14;

        private enum MouseMessages
        {
            WM_LBUTTONDOWN = 0x0201,
            WM_LBUTTONUP = 0x0202,
            WM_MOUSEMOVE = 0x0200,
            WM_MOUSEWHEEL = 0x020A,
            WM_RBUTTONDOWN = 0x0204,
            WM_RBUTTONUP = 0x0205
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct POINT
        {
            public int x;
            public int y;
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct MSLLHOOKSTRUCT
        {
            public POINT pt;
            public uint mouseData;
            public uint flags;
            public uint time;
            public IntPtr dwExtraInfo;
        }

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

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
            IntPtr wParam, IntPtr lParam);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr GetModuleHandle(string lpModuleName);


        //------------------------------------------------------------------------------------------

        const uint TOUCH_FLAG = 0xFF515700;
        static bool IsTouch(IntPtr lParam)
        {
            MSLLHOOKSTRUCT hookData = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam,
                typeof(MSLLHOOKSTRUCT));
            uint extraInfo = (uint)hookData.dwExtraInfo.ToInt32();
            if ((extraInfo & TOUCH_FLAG) == TOUCH_FLAG)
                return true;
            return false;
        }
    }
}

...