/*
* Process Hacker -
* keyed event
*
* Copyright (C) 2009 wj32
*
* This file is part of Process Hacker.
*
* Process Hacker is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Process Hacker is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Process Hacker. If not, see .
*/
using System;
using System.Collections.Generic;
using System.Text;
using ProcessHacker.Native.Api;
using ProcessHacker.Native.Objects;
using ProcessHacker.Native.Security;
namespace ProcessHacker.Native.Threading
{
///
/// Represents a keyed event.
///
public sealed class KeyedEvent : NativeObject
{
///
/// Creates a new keyed event.
///
public KeyedEvent()
: this(null)
{ }
///
/// Creates or opens a keyed event.
///
///
/// The name of the new keyed event, or the name of an
/// existing keyed event.
///
public KeyedEvent(string name)
{
this.Handle = KeyedEventHandle.Create(
KeyedEventAccess.All,
name,
ObjectFlags.OpenIf,
null
);
}
///
/// Releases the specified key. If no other thread is waiting
/// on the key, the function blocks until a thread does.
///
/// The key, which must be divisible by 2.
public void ReleaseKey(int key)
{
this.Handle.ReleaseKey(new IntPtr(key), false, long.MinValue, false);
}
///
/// Releases the specified key. If no other thread is waiting
/// on the key, the function blocks until a thread does.
///
/// The key, which must be divisible by 2.
/// A timeout value, in milliseconds.
public void ReleaseKey(int key, int timeout)
{
this.Handle.ReleaseKey(new IntPtr(key), false, timeout * Win32.TimeMsTo100Ns, true);
}
///
/// Releases the specified key. If no other thread is waiting
/// on the key, the function blocks until a thread does.
///
/// The key, which must be divisible by 2.
/// A time to wait until.
public void ReleaseKey(int key, DateTime timeout)
{
this.Handle.ReleaseKey(new IntPtr(key), false, timeout.ToFileTime(), false);
}
///
/// Waits for the specified key to be released.
///
/// The key, which must be divisible by 2.
public void WaitKey(int key)
{
this.Handle.WaitKey(new IntPtr(key), false, long.MinValue, false);
}
///
/// Waits for the specified key to be released.
///
/// The key, which must be divisible by 2.
/// A time to wait until.
public void WaitKey(int key, int timeout)
{
this.Handle.WaitKey(new IntPtr(key), false, timeout * Win32.TimeMsTo100Ns, true);
}
///
/// Waits for the specified key to be released.
///
/// The key, which must be divisible by 2.
/// A time to wait until.
public void WaitKey(int key, DateTime timeout)
{
this.Handle.WaitKey(new IntPtr(key), false, timeout.ToFileTime(), false);
}
}
}