Answer the question
In order to leave comments, you need to log in
C#, Windows, How to prevent RawInputDevice from sending messages to the active window?
Hi all.
I am working with a program that receives messages from a card reader and somehow works with them further.
The problem is that the program runs in the background, minimized to tray. As a result, the Windows message is also sent to the active window of the system, which, of course, is unacceptable. How can I make the message go only to my program?
// sample
private void SplashLoad(object sender, EventArgs e)
{
var rid = new RawInputDevice[1];
rid[0].UsagePage = HidUsagePage.GENERIC;
rid[0].Usage = HidUsage.Keyboard;
rid[0].Flags = RawInputDeviceFlags.INPUTSINK;
rid[0].Target = Handle;
if (!Win32.RegisterRawInputDevices(rid, (uint)rid.Length,
(uint)Marshal.SizeOf(rid[0])))
{
throw new ApplicationException("Не удалось зарегистрировать устройство.");
}
inputBuffer = "";
this.terminateFlag = false;
t = new Thread(MainThread);
t.Start(this);
}
// another cs file goes there
internal enum RawInputDeviceFlags
{
/// <summary>No flags.</summary>
NONE = 0,
/// <summary>If set, this removes the top level collection from the inclusion list. This tells the operating system to stop reading from a device which matches the top level collection.</summary>
REMOVE = 0x00000001,
/// <summary>If set, this specifies the top level collections to exclude when reading a complete usage page. This flag only affects a TLC whose usage page is already specified with PageOnly.</summary>
EXCLUDE = 0x00000010,
/// <summary>If set, this specifies all devices whose top level collection is from the specified UsagePage. Note that Usage must be zero. To exclude a particular top level collection, use Exclude.</summary>
PAGEONLY = 0x00000020,
/// <summary>If set, this prevents any devices specified by UsagePage or Usage from generating legacy messages. This is only for the mouse and keyboard.</summary>
NOLEGACY = 0x00000030,
/// <summary>If set, this enables the caller to receive the input even when the caller is not in the foreground. Note that WindowHandle must be specified.</summary>
INPUTSINK = 0x00000100,
/// <summary>If set, the mouse button click does not activate the other window.</summary>
CAPTUREMOUSE = 0x00000200,
/// <summary>If set, the application-defined keyboard device hotkeys are not handled. However, the system hotkeys; for example, ALT+TAB and CTRL+ALT+DEL, are still handled. By default, all keyboard hotkeys are handled. NoHotKeys can be specified even if NoLegacy is not specified and WindowHandle is NULL.</summary>
NOHOTKEYS = 0x00000200,
/// <summary>If set, application keys are handled. NoLegacy must be specified. Keyboard only.</summary>
APPKEYS = 0x00000400,
/// If set, this enables the caller to receive input in the background only if the foreground application
/// does not process it. In other words, if the foreground application is not registered for raw input,
/// then the background application that is registered will receive the input.
/// </summary>
EXINPUTSINK = 0x00001000,
DEVNOTIFY = 0x00002000
}
public enum HidUsagePage : ushort
{
/// <summary>Unknown usage page.</summary>
UNDEFINED = 0x00,
/// <summary>Generic desktop controls.</summary>
GENERIC = 0x01,
/// <summary>Simulation controls.</summary>
SIMULATION = 0x02,
/// <summary>Virtual reality controls.</summary>
VR = 0x03,
/// <summary>Sports controls.</summary>
SPORT = 0x04,
/// <summary>Games controls.</summary>
GAME = 0x05,
/// <summary>Keyboard controls.</summary>
KEYBOARD = 0x07,
}
public enum HidUsage : ushort
{
/// <summary>Unknown usage.</summary>
Undefined = 0x00,
/// <summary>Pointer</summary>
Pointer = 0x01,
/// <summary>Mouse</summary>
Mouse = 0x02,
/// <summary>Joystick</summary>
Joystick = 0x04,
/// <summary>Game Pad</summary>
Gamepad = 0x05,
/// <summary>Keyboard</summary>
Keyboard = 0x06,
/// <summary>Keypad</summary>
Keypad = 0x07,
/// <summary>Muilt-axis Controller</summary>
SystemControl = 0x80,
/// <summary>Tablet PC controls</summary>
Tablet = 0x80,
/// <summary>Consumer</summary>
Consumer = 0x0C,
}
Answer the question
In order to leave comments, you need to log in
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question