Я хочу использовать следующий код для доступа к состоянию клавиатуры в определенное время.
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Windows.Input;
namespace some.any
{
public class ANY_CLASS
{
[STAThread] //seems to do nothing here
public static short ThisIsCalledByAnExternalProgram()
{
try
{
if (Keyboard.IsKeyDown(Key.LeftAlt))
{
return 1;
}
else
{
return 0;
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
return 2;
}
}
}
Этот код требует компиляции некоторых библиотек: WindowsBase.dll и PresentationCore.dll
Клавиатура требует STA-потока, обычно я записываю атрибут [STAThread] в основную функцию, и это будет работать, но этот код будет использоваться как DLL, поэтому я не могу этого сделать Моя функция ThisIsCalledByAnExternalProgram () должна работать как STA, но это не так.
Как мне заставить этот код работать как dll?
EDIT:
Что происходит, когда вы вызываете ThisIsCalledByAnExternalProgram () внутри помеченного методом STAThread метода?
Когда я вызываю функцию с моей внешней программой, я получаю исключение:
System.InvalidOperationException: ... Вызывающий поток должен быть STA, поскольку это требуется для многих компонентов пользовательского интерфейса.
Стек это:
System.Windows.Input.InputManager..ctor()
System.Windows.Input.InputManager.GetCurrentInputManagerImpl()
ThisIsCalledByAnExternalProgram()
EDIT # 3:
Я неправильно прочитал вопрос - ... внутри помеченного STAThread ... В настоящее время я не могу попробовать этот. предположим, что это проходит и работает - это все равно не решит проблему, так как я не могу контролировать вызывающую программу.
EDIT # 2:
Используйте хук Win32:
Я хочу остаться в .net из-за портативности. Все глобальные варианты хуков в конце концов зависят от компьютера под виртуальной машиной, я хочу использовать подготовленный класс Keyboard класса c #.
Работает в другом контексте - вот короткая демонстрация:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Input;
//Requires WindowsBase.dll
//Requires PresentationCore.dll
namespace KeyBoardDemo
{
class Program
{
[STAThread]
static void Main(string[] args)
{
while (true)
{
if (Keyboard.IsKeyDown(Key.LeftAlt))
{
Console.WriteLine("LEFT ALT IS PRESSED");
}
else
{
Console.WriteLine("LEFT ALT IS NOT PRESSED");
}
}
}
}
}