Вы, вероятно, нашли пример кода, который был изначально написан на Visual Basic.Аргумент WParam для SendMessage () задокументирован как BOOL.Это должно быть либо ЛОЖЬ (0), либо ИСТИНА (1).Причудой VB6 является то, что его логическое значение ИСТИНА равно -1.Причина немного неясна и связана с тем, как работают операторы AND и OR.
Ваш текущий код работает случайно, код Windows, который интерпретирует сообщение, просто обрабатывает любое ненулевое значение как «ИСТИНА».
Однако существует более серьезная проблема: ваше объявление SendMessage () неверно.Аргументы WParam и LParam, вероятно, объявлены как «int», 32-битное значение.Однако в 64-разрядных операционных системах они являются 64-разрядными.В такой операционной системе ваш вызов SendMessage () потерпит неудачу.Также есть некоторые шансы, что вы уже работаете в 64-битной операционной системе, и эти аргументы объявлены как Long, как они были объявлены в VB6.В этом случае ваш код не будет работать в 32-разрядной операционной системе.
Правильная декларация для SendMessage:
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
И правильный способ отправки сообщения:
SendMessage(DeviceHandle, WM_CAP_SET_SCALE, (IntPtr)1, IntPtr.Zero);
Это будет правильно работать как в 32-битных, так и в 64-битных операционных системах.