Можете обнаружить сенсорный щелчок на приложении MFC Windows? [Дубликат]

SELECT
    top 1 *
FROM
    table_name
WHERE
    column_name IN (
        SELECT
            top N column_name
        FROM
            TABLE
        ORDER BY
            column_name
    )
ORDER BY
    column_name DESC

Я написал этот запрос для поиска N-й строки. Пример с этим запросом будет

SELECT
    top 1 *
FROM
    Employee
WHERE
    emp_id IN (
        SELECT
            top 7 emp_id
        FROM
            Employee
        ORDER BY
            emp_id
    )
ORDER BY
    emp_id DESC
1
задан Joe 25 April 2015 в 09:42
поделиться

1 ответ

Ссылка, которую вы опубликовали, показывает единственный надежный способ распознавания сообщений мыши, генерируемых физической мышью, и тех, которые были синтезированы в ответ на прикосновение и ввод пера.

Для полноты здесь код. Код зависит от состояния, которое действует только при обработке сообщения мыши. Вызов его в любое другое время имеет неопределенное поведение:

bool IsTouchEvent() {
    const LONG_PTR c_SIGNATURE_MASK = 0xFFFFFF00;
    const LONG_PTR c_MOUSEEVENTF_FROMTOUCH = 0xFF515700;

    LONG_PTR extraInfo = GetMessageExtraInfo();
    return ( ( extraInfo & c_SIGNATURE_MASK ) == c_MOUSEEVENTF_FROMTOUCH );
}

Дополнительные WM_MOUSEMOVE сообщения, которые вы наблюдаете, являются артефактом того, как система реализует свою внутреннюю бухгалтерскую отчетность. Например, если окно отображается или скрыто, курсор мыши может находиться за другим окном и должен быть пересчитан. Для этого система синтезирует искусственное сообщение WM_MOUSEMOVE.

Этот эффект объясняется в блоге Raymond Chen: Почему я получаю ложные сообщения WM_MOUSEMOVE? .

4
ответ дан IInspectable 23 August 2018 в 00:26
поделиться
  • 1
    Я подозревал, что что-то подобное происходит, однако сохранение позиции мыши и игнорирование повторяющихся сообщений работает при изменении фокуса вдали от окна, но не наоборот. – Joe 25 April 2015 в 16:15
  • 2
    @Joe: те сообщения WM_MOUSEMOVE не связаны с сенсорным вводом. Они будут генерироваться в системах, где нет сенсорного устройства ввода. Если вам нужно найти способ отфильтровать эти сообщения, вам, вероятно, придется задать новый вопрос. – IInspectable 29 April 2015 в 08:25
  • 3
    Если события соответствовали фактическому предыдущему движению мыши (а не касанию), мне было бы все равно, так как значения соответствуют предыдущему / следующему движению мыши. Однако они вызваны событием touch (в другое окно). – Joe 29 April 2015 в 14:34
  • 4
    Вы обнаружите, что при фильтрации входных данных Touch от WM_MOUSEMOVE, что последний шаг при выпуске сенсорного указателя говорит о том, что он находится на мышском устройстве. Все предыдущие приходят из Touch через дополнительную информацию. Это неприятность, если вы пытаетесь закодировать разные сенсорные и амперные возможности; поведение мыши в приложении. Большинство WM_MOUSEMOVES от касания - это белая ложь, но последняя - противная! – Greg 18 January 2017 в 07:52
  • 5
    @Greg: Я считаю, что финал WM_MOUSEMOVE вообще не связан с сенсорным входом. Это Давайте обернем все, отправив сообщение поддельного движения мыши , которое также будет создано в системах без касания. Конечно, это мешает при интерпретации сенсорного ввода, но это то же самое сообщение, которое вы получаете, когда прикладываете другое окно на передний план с помощью мыши. – IInspectable 20 January 2017 в 20:28
Другие вопросы по тегам:

Похожие вопросы: