Проблема с десятичным преобразованием беседы в шестнадцатеричное значение для SendMessage

#c# #memory #hex #decimal

#c# #память #шестнадцатеричное #десятичное

Вопрос:

Я пытаюсь понять, что такое правило для преобразования шестнадцатеричного int (десятичного) и IntrPtr.

Я где-то читал, что оно должно представлять «более высокую память» или что-то в этом роде.

Если бы кто-нибудь мог мне это немного объяснить, это было бы здорово.

Но на самом деле это примерно следующее:

Я хочу использовать SendMessage для отправки APPCOMMAND_SAVE (значение int 32).

 const int WM_APPCOMMAND = 0x319;
  

В MS docs написано #define WM_APPCOMMAND / 0x 0 319, но это, похоже, не имеет никакого значения. У меня почему-то проблемы с нулевыми знаками. Как всегда работает 0x319.

Итак, я обнаружил, что, например, vol up равен:

 const int APPCOMMAND_VOLUME_UP = 0xA0000; // 10
  

Теперь я пытаюсь преобразовать APPCOMMAND_SAVE (32) в правильное шестнадцатеричное значение:

 const int APPCOMMAND_SAVE = 0x200000; //? Hex value of 32 is the right?
  

Комментарии:

1. Шестнадцатеричное значение 0x0319 идентично 0x319 , таким же образом, что 01000 равно 1000 . Обычно мы просто отбрасываем начальные 0 буквы s, потому что они не служат никакой цели

2. Да, это то, что меня смущает. В какой системе счисления 10 из ms docs? Для APPCOMMAND_VOLUME_UP в качестве примера. И какое значение является правильным для APPCOMMAND_SAVE?

3. Я добавил некоторое объяснение в приведенном ниже ответе относительно того, как lParam это работает и почему оно записывается как 0x200000 , а не 0x20

4. На самом деле никто не отвечает на вопрос OPs. Целое число хранится в виде четырех байтов. Вам нужно отправить байты, и не имеет значения, является ли число десятичным или шестнадцатеричным. Десятичное или шестнадцатеричное значение применяется только при преобразовании числа в строку. Итак, все, что вам нужно сделать, это следующее: byte[] bytes = BitConverter . getBytes(число). Байты не расположены последовательно, поскольку порядок микропроцессора от самого низкого адреса памяти до самого высокого адреса равен 1,0,3,2

5. @jdweng Вы не должны отправлять байты в SendMessage for lParam . lParam должно быть определено как an IntPtr , a uint или a ulong в зависимости от использования.

Ответ №1:

Посмотрев немного больше lParam на WM_APPCOMMAND вызов API, я вижу, что он содержит три отдельных значения в битовой маске:

  • cmd — на какую конкретную команду приложения вы ссылаетесь [2 байта]
  • uDevice — который указывает устройство, сгенерировавшее ввод [2 байта]
  • dwKeys — который указывает, какие виртуальные клавиши нажаты, если таковые имеются [2 байта]

Значения для всех этих значений содержатся lParam отдельно в виде битовой маски, причем каждое из них занимает 2 байта. Поэтому они структурированы lParam следующим образом:

 0xAADDKK
  

Где AA указывает APPCOMMAND отправляемое, DD указывает uDevice и KK указывает dwKeys .

Имея это в виду, чтобы отправить команду для APPCOMMAND_SAVE (decimal 32, hex 0x20) с no uDevice и no dwKeys , правильное lParam значение для использования:

 0x200000
  

Что касается вашего другого пункта:

В документах MS указано #define WM_APPCOMMAND / 0x0319, но это, похоже, не имеет никакого значения. У меня почему-то проблемы с нулевыми знаками. Как всегда работает 0x319.

Шестнадцатеричные числа функционируют в соответствии с базой-10 в том смысле, что начальные 0 буквы s удаляются из чисел. Поэтому шестнадцатеричное 0x0319 значение совпадает с 0x319 и также 0x00000319 , точно так же, как и в base-10, 1000 является тем же числом 01000 , что и в самом деле 00000001000 .

Комментарии:

1. SendMessage(fwx, WM_APPCOMMAND, IntPtr.Zero, (IntPtr)APPCOMMAND_SAVE) — это моя функция. Это нормально?

2. А что насчет 0x20, 0x2 и 0x200000? 😉

3. @Luckylazuli Это выглядит правильно с точки зрения lParam , но, не видя остальной части кода, это трудно понять. Конечно APPCOMMAND_SAVE , 0x200000 значение является правильным, указывая, что для выполнения была нажата клавиша ( FAPPCOMMAND_KEY = 0x0000 ) APPCOMMAND_SAVE .

4. @Luckylazuli 0x20 — это НЕ то же самое, что 0x2 или 0x200000 . 32 , 2 , и 2097152 это разные числа.

5. Думаю, теперь я понимаю, зачем добавлять нулевые знаки. Речь идет о семантике отображения количества цифр. Например, когда вы, например, 0100 decimal используется для выражения того, что оно может доходить до 9999. В этом отношении имеет смысл добавить избыточные нули.