Ваши ограничения в отношении того, какие функции / заголовки вы можете использовать, создают сильное впечатление, что вы должны непосредственно анализировать и манипулировать представлениями float
. Это также предполагает допущение о конкретном представлении float
, но формат двоичного32 IEEE-754 с прямым порядком байтов является довольно хорошей ставкой. Я полагаю, вы уже изучали это.
Вы можете получить доступ к представлению значения с плавающей запятой через указатель unsigned char
:
_Bool my_isnan(float f) {
unsigned char *bytes = (unsigned char *) &f;
// analyze bytes[0], bytes[1], etc. ...
}
Вы можете манипулировать float
представлениями аналогичными способами.
Я оставляю вам подробности анализов / манипуляций, так как это кажется ключевым моментом упражнения, и я не собираюсь делать вашу домашнюю работу за вас.
Взгляните на эту статью Processing Global Mouse и Keyboard Hooks в C#. Парень, который написал эту статью, провел большое исследование вокруг проблемы.
Возможно, существует что-то в нем, можно использовать.
Подробно останавливаясь на (корректном) ответе Josh's. Вот подпись PInvoke для того метода.
public partial class NativeMethods {
/// Return Type: BOOL->int
///fBlockIt: BOOL->int
[System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint="BlockInput")]
[return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
public static extern bool BlockInput([System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)] bool fBlockIt) ;
}
public static void BlockInput(TimeSpan span) {
try {
NativeMethods.BlockInput(true);
Thread.Sleep(span);
} finally {
NativeMethods.BlockInput(false);
}
}
Править
Добавленный некоторый код, чтобы продемонстрировать, как заблокироваться для интервала
Изучите функцию BlockInput Win32
Походит на некоторое забавное тестирование :)