2015-07-29 7 views
1

Что я хотел бы поймать нажатием клавиши с помощью JScript .NET и скомпилировать код с помощью этого jsc.exe. Итак, есть ли какой-либо эквивалент «addEventListener (« keyDown », keyCheck)» из FLASH actionscript. Или GetAsyncKeyState() из C++. И какую библиотеку я должен использовать? Пожалуйста, будьте любезны поделиться небольшим простым примером.Как прослушивать ключи в JScript.Net

+0

ли вы выглядите в http://stackoverflow.com/questions/3503562/how-to-call- windows-api-functions-in-jscript - во втором ответе упоминается компонент с именем DynamicWarpperX, который позволяет JScript.NET вызывать функции Windows API. –

ответ

1

Вот простое решение, если вы пишете консольное приложение.

import System; 

Console.Write("Press the M key... "); 

var key:ConsoleKeyInfo; 

while (1) { 
    while (!Console.KeyAvailable) { 
     System.Threading.Thread.Sleep(1); 
    } 
    key = Console.ReadKey(1); 
    if (key.Key == ConsoleKey.M) break; 
} 

Console.Write("Accepted."); 

Подробнее о ConsoleKeyInfo.


Если вам нужно GetAsyncKeyState(), можно получить доступ к методу в JScript.NET. Пара дней назад I came across a JScript.NET function, который предоставляет методы API Win32 через P/Invoke. Здесь он немного модифицирован для более простого синтаксиса (позволяющий передавать аргументы из определения функций API).

import System; 
import System.Reflection; 
import System.Reflection.Emit; 

// Invoke a Win32 P/Invoke call. 
// credit: http://cx20.main.jp/blog/hello/2013/03/07/hello-win32-api-jscript-net-world/ 
function InvokeWin32(dllName:String, returnType:Type, methodName:String, params:Object[]) { 

    var paramTypes:Type[] = new Type[params.length]; 
    for (var i:int in params) { 
     paramTypes[i] = params[i].GetType(); 
    } 

    // Begin to build the dynamic assembly 
    var domain = AppDomain.CurrentDomain; 
    var name = new System.Reflection.AssemblyName('PInvokeAssembly'); 
    var assembly = domain.DefineDynamicAssembly(name, AssemblyBuilderAccess.Run); 
    var module = assembly.DefineDynamicModule('PInvokeModule'); 
    var type = module.DefineType('PInvokeType',TypeAttributes.Public 
     + TypeAttributes.BeforeFieldInit); 

    // Define the actual P/Invoke method 
    var method = type.DefineMethod(methodName, MethodAttributes.Public 
     + MethodAttributes.HideBySig + MethodAttributes.Static + 
     MethodAttributes.PinvokeImpl, returnType, paramTypes); 

    // Apply the P/Invoke constructor 
    var ctor = System.Runtime.InteropServices.DllImportAttribute.GetConstructor(
     [System.String] 
    ); 
    var attr = new System.Reflection.Emit.CustomAttributeBuilder(ctor, [dllName]); 
    method.SetCustomAttribute(attr); 

    // Create the temporary type, and invoke the method. 
    var realType = type.CreateType(); 
    return realType.InvokeMember(methodName, BindingFlags.Public + BindingFlags.Static 
     + BindingFlags.InvokeMethod, null, null, params); 
} 

С помощью этой функции вы можете найти методы DLL Win32 со следующим синтаксисом. (См говорил, что это было проще?).

// ShowWindowAsync(hWnd:IntPtr, nCmdShow:int); 
function ShowWindowAsync(... args:Object[]):boolean { 
    return InvokeWin32("user32.dll", System.Boolean, "ShowWindowAsync", args); 
} 

// GetWindowLong(hWnd:IntPtr, nIndex:int); 
function GetWindowLong(... args:Object[]):int { 
    return InvokeWin32("user32.dll", System.Int32, "GetWindowLong", args); 
} 

// FindWindowEx(parentHandle:IntPtr, childAfter:IntPtr, 
//  lclassName:IntPtr, windowTitle:String); 
function FindWindowEx(... args:Object[]):IntPtr { 
    return InvokeWin32("user32.dll", System.IntPtr, "FindWindowEx", args); 
} 

И я никогда не использовал GetAsyncKeyState(); но поскольку это метод user32.dll, я предполагаю, что он будет работать одинаково. (Edit: Это делает.)

// GetAsyncKeyState(vKey:int); 
function GetAsyncKeyState(... args:Object[]):short { 
    return InvokeWin32("user32.dll", System.Int16, "GetAsyncKeyState", args); 
} 

Тогда для тривиального примера:

import System;    // for Console methods 
import System.Windows.Forms; // for Keys object constants 

Console.Write("Press the M key... "); 

// while the M key is not being pressed, sleep 
while (!GetAsyncKeyState(Keys.M)) { 
    System.Threading.Thread.Sleep(1); 
} 

// flush input buffer 
while (Console.KeyAvailable) Console.ReadKey(1); 

Console.WriteLine("Accepted."); 
+0

Вы, сэр, потрясающие. – Kraken

+0

Я умираю, чтобы узнать об этом – Kraken

+0

awesome. Я задаюсь вопросом, как далеко вы можете добраться с помощью p/invoke и jscript.net. Особенно маршалинг. И как можно эмулировать атрибуты. – npocmaka

 Смежные вопросы

  • Нет связанных вопросов^_^