2012-04-18 8 views
1

Objective-CからMonoMacの作業にこのポートを作るのを手伝ってもらえますか?Objective-CからMonoMacの作業にこのポートをしようとする

CGEventSourceRef eventSource = CGEventSourceCreate(kCGEventSourceStateHIDSystemState); 

CGEventRef keyEventDown = CGEventCreateKeyboardEvent(eventSource, 0, true); 

NSString * characters = @"ABCD"; 

UniChar buffer; 

for (int i = 0; i < [characters length]; i++) 
{ 
    [characters getCharacters:&buffer range:NSMakeRange(i, 1)]; 

    keyEventDown = CGEventCreateKeyboardEvent(eventSource, 1, true); 

    CGEventKeyboardSetUnicodeString(keyEventDown, 1, &buffer); 

    CGEventPost(kCGHIDEventTap, keyEventDown); 

    CFRelease(keyEventDown); 
} 

CFRelease(eventSource); 

私はDLLに次のコードを使用してインポートしましたが、Objective-CのUniCharをどうすればいいのかわかりません。 Objective-Cの変更が​​C#でどのタイプを使うべきかわかりません。これは、Obj-Cが変更する必要のあるポインタであり、私はC#コードで再度アクセスできます。 Cにおいて

using System; 

using System.Runtime.InteropServices; 

using MonoMac; 

namespace SomeNameSpace 
{ 

public unsafe static class Native 
{ 
    [DllImport(Constants.CoreGraphicsLibrary)] 
    public static extern IntPtr CGEventCreateKeyboardEvent(IntPtr source, ushort virtualKey, bool keyDown); 

    [DllImport(Constants.CoreGraphicsLibrary)] 
    public static extern void CGEventKeyboardSetUnicodeString(IntPtr @event, ulong stringLength, char* unicodeString); 

    [DllImport(Constants.CoreGraphicsLibrary)] 
    public static extern IntPtr CGEventSourceCreate(CGEventSourceStateID stateID); 

    [DllImport(Constants.CoreGraphicsLibrary)] 
    public static extern void CGEventPost(CGEventTapLocation tap, IntPtr @event); 

    [DllImport(Constants.CoreFoundationLibrary)] 
    public static extern void CFRelease (IntPtr cf); 
} 

public enum CGEventTapLocation:uint 
{ 
    kCGHIDEventTap = 0, 

    kCGSessionEventTap, 

    kCGAnnotatedSessionEventTap 
} 

public enum CGEventSourceStateID:int 
{ 
    kCGEventSourceStatePrivate = -1, 

    kCGEventSourceStateCombinedSessionState = 0, 

    kCGEventSourceStateHIDSystemState = 1 
} 
} 

public unsafe void SomeMethod() 
{ 
    IntPtr eventSource = Native.CGEventSourceCreate(CGEventSourceStateID.kCGEventSourceStateHIDSystemState); 


IntPtr keyEventDown = Native.CGEventCreateKeyboardEvent(cgEventSource,0,true); 

string characters = @"ABCD"; 

char buffer; 

for (int i = 0; i < characters.Length; i++) 
{ 
    buffer = characters[i]; 

    keyEventDown = Native.CGEventCreateKeyboardEvent(eventSource, 1, true); 

    Native.CGEventKeyboardSetUnicodeString(keyEventDown, 1, &buffer); 

    Native.CGEventPost(CGEventTapLocation.kCGHIDEventTap, keyEventDown); 

    Native.CFRelease(keyEventDown); 
} 

Native.CFRelease(eventSource); 
} 

答えて

1

unicharは、1つのUTF-16コードユニットを保持するための符号なし16ビットタイプです。 UTF-16文字は、1または2のunichars(通常1)で構成されます。 C#ではまったく同じですchar

+0

。それは動作していません。しかし、私はメモリバイトを自分で入れてしまって、それがうまくいかなかったので、理由はキャストではありません。 – Peyman

+0

@Peyman:モノで 'char'のアドレスを取得するのは正当なのでしょうか?もしそれが非ネイティブ型としてそれをautoboxesすれば? – JeremyP

0

UniCharunsigned shortと等価です。

1

私は解決策を見つけました!

それはちょうどこの小さな変化に私の作品:

public static extern void CGEventKeyboardSetUnicodeString(IntPtr @event, uint stringLength, char* unicodeString); 

代わりの

public static extern void CGEventKeyboardSetUnicodeString(IntPtr @event, ulong stringLength, char* unicodeString); 

偉大な一日を、私もと思った)

関連する問題