Quantcast
Channel: Magno's Blog » DotNet
Viewing all articles
Browse latest Browse all 7

Reading from and writing to the Clipboard

$
0
0

Have you ever tried putting something in the clipboard? Well, aside from literally copying or pasting?
If you have ever tried something like this in .NET, you might remember, you need to call the functionality in a thread with STA mode. Try doing this in your NAV Development Environment…

Below, you will find a download for a Clipboard Handler in NAV. It allows you to set or read the clipboard. For achieving this, we compile a .NET DLL in memory and execute that one.

Please note that this Codeunit is provided “as is”.

OBJECT Codeunit 50000 Clipboard Handler
{
  OBJECT-PROPERTIES
  {
    Date=22/09/15;
    Time=13:57:38;
    Modified=Yes;
  }
  PROPERTIES
  {
    SingleInstance=Yes;
    OnRun=BEGIN
          END;

  }
  CODE
  {
    VAR
      HandlerAssembly@1100084000 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, 

PublicKeyToken=b77a5c561934e089'.System.Reflection.Assembly" RUNONCLIENT;

    LOCAL PROCEDURE Initialize@1100084002();
    BEGIN
      IF (NOT ISNULL(HandlerAssembly)) THEN
        EXIT;

      CreateAssembly(CreateAssemblyCode, HandlerAssembly);
    END;

    LOCAL PROCEDURE CreateAssembly@1100084003(CodeSnippet@1100084005 : Text;VAR ResultAssembly@1100084004 : DotNet 

"'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Reflection.Assembly" RUNONCLIENT);
    VAR
      CodeSnippetCompileUnit@1100084000 : DotNet "'System, Version=4.0.0.0, Culture=neutral, 

PublicKeyToken=b77a5c561934e089'.System.CodeDom.CodeSnippetCompileUnit" RUNONCLIENT;
      CSharpCodeProvider@1100084001 : DotNet "'System, Version=4.0.0.0, Culture=neutral, 

PublicKeyToken=b77a5c561934e089'.Microsoft.CSharp.CSharpCodeProvider" RUNONCLIENT;
      CompilerParameters@1100084002 : DotNet "'System, Version=4.0.0.0, Culture=neutral, 

PublicKeyToken=b77a5c561934e089'.System.CodeDom.Compiler.CompilerParameters" RUNONCLIENT;
      CompilerResults@1100084003 : DotNet "'System, Version=4.0.0.0, Culture=neutral, 

PublicKeyToken=b77a5c561934e089'.System.CodeDom.Compiler.CompilerResults" RUNONCLIENT;
      CodeSnippetCompileUnitArray@1100084006 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, 

PublicKeyToken=b77a5c561934e089'.System.Array" RUNONCLIENT;
    BEGIN

      CodeSnippetCompileUnit := CodeSnippetCompileUnit.CodeSnippetCompileUnit(CodeSnippet);

      CSharpCodeProvider := CSharpCodeProvider.CSharpCodeProvider;

      CompilerParameters := CompilerParameters.CompilerParameters;

      CompilerParameters.ReferencedAssemblies.Add('System.dll');
      CompilerParameters.ReferencedAssemblies.Add('System.Windows.Forms.dll');

      CompilerParameters.GenerateInMemory := TRUE;

      CodeSnippetCompileUnitArray := CodeSnippetCompileUnitArray.CreateInstance(GETDOTNETTYPE(CodeSnippetCompileUnit),1);
      CodeSnippetCompileUnitArray.SetValue(CodeSnippetCompileUnit, 0);

      CompilerResults := CSharpCodeProvider.CompileAssemblyFromDom(CompilerParameters, CodeSnippetCompileUnitArray);

      ResultAssembly := CompilerResults.CompiledAssembly;
    END;

    LOCAL PROCEDURE CreateAssemblyCode@1100084000() : Text;
    VAR
      StringBuilder@1100084000 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, 

PublicKeyToken=b77a5c561934e089'.System.Text.StringBuilder" RUNONCLIENT;
    BEGIN
      StringBuilder := StringBuilder.StringBuilder;
      StringBuilder.AppendLine('using System.Threading;');

      StringBuilder.AppendLine('namespace ClipboardHelper');
      StringBuilder.AppendLine('{');
      StringBuilder.AppendLine('    class ClipboardManager');
      StringBuilder.AppendLine('    {');
      StringBuilder.AppendLine('        private ClipboardHelper ch = new ClipboardHelper();');

      StringBuilder.AppendLine('        public string GetText()');
      StringBuilder.AppendLine('        {');
      StringBuilder.AppendLine('            Thread thr = new Thread(ch.GetText);');
      StringBuilder.AppendLine('            thr.SetApartmentState(ApartmentState.STA);');
      StringBuilder.AppendLine('            thr.IsBackground = false;');
      StringBuilder.AppendLine('            thr.Start();');
      StringBuilder.AppendLine('            thr.Join();');
      StringBuilder.AppendLine('            return ch.ClipboardText;');
      StringBuilder.AppendLine('        }');
      StringBuilder.AppendLine('        ');
      StringBuilder.AppendLine('        public void SetText(string ClipboardText)');
      StringBuilder.AppendLine('        {');
      StringBuilder.AppendLine('            ch.ClipboardText = ClipboardText;');
      StringBuilder.AppendLine('            Thread thr = new Thread(ch.SetText);');
      StringBuilder.AppendLine('            thr.SetApartmentState(ApartmentState.STA);');
      StringBuilder.AppendLine('            thr.IsBackground = false;');
      StringBuilder.AppendLine('            thr.Start();');
      StringBuilder.AppendLine('        }');
      StringBuilder.AppendLine('    }');

      StringBuilder.AppendLine('    class ClipboardHelper');
      StringBuilder.AppendLine('    {');
      StringBuilder.AppendLine('        public string ClipboardText { get; set; }');

      StringBuilder.AppendLine('        public void GetText()');
      StringBuilder.AppendLine('        {');
      StringBuilder.AppendLine('            ClipboardText = "";');
      StringBuilder.AppendLine('            if (System.Windows.Forms.Clipboard.ContainsText())');
      StringBuilder.AppendLine('                ClipboardText = System.Windows.Forms.Clipboard.GetText();');
      StringBuilder.AppendLine('        }');
      StringBuilder.AppendLine('        public void SetText()');
      StringBuilder.AppendLine('        {');
      StringBuilder.AppendLine('            System.Windows.Forms.Clipboard.SetText(ClipboardText);');
      StringBuilder.AppendLine('        }');
      StringBuilder.AppendLine('    }');
      StringBuilder.AppendLine('}');

      EXIT(StringBuilder.ToString);
    END;

    PROCEDURE GetClipboardText@2040002() : Text;
    VAR
      Activator@2040001 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, 

PublicKeyToken=b77a5c561934e089'.System.Activator" RUNONCLIENT;
      Type@2040006 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Type" 

RUNONCLIENT;
      Object@2040002 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Object" 

RUNONCLIENT;
      MethodInfo@2040004 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, 

PublicKeyToken=b77a5c561934e089'.System.Reflection.MethodInfo" RUNONCLIENT;
      ParamArray@2040008 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, 

PublicKeyToken=b77a5c561934e089'.System.Array" RUNONCLIENT;
    BEGIN
      Initialize;

      Type := HandlerAssembly.GetType('ClipboardHelper.ClipboardManager');
      Object := Activator.CreateInstance(Type);
      MethodInfo := Type.GetMethod('GetText');

      ParamArray := ParamArray.CreateInstance(GETDOTNETTYPE(Object),0);

      Object := MethodInfo.Invoke(Object,ParamArray);

      EXIT(Object.ToString);
    END;

    PROCEDURE SetClipboardText@2040001(NewClipboardText@2040008 : Text);
    VAR
      Activator@2040005 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, 

PublicKeyToken=b77a5c561934e089'.System.Activator" RUNONCLIENT;
      Type@2040004 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Type" 

RUNONCLIENT;
      Object@2040003 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Object" 

RUNONCLIENT;
      MethodInfo@2040002 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, 

PublicKeyToken=b77a5c561934e089'.System.Reflection.MethodInfo" RUNONCLIENT;
      ParamArray@2040001 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, 

PublicKeyToken=b77a5c561934e089'.System.Array" RUNONCLIENT;
    BEGIN
      Initialize;

      Type := HandlerAssembly.GetType('ClipboardHelper.ClipboardManager');
      Object := Activator.CreateInstance(Type);
      MethodInfo := Type.GetMethod('SetText');

      ParamArray := ParamArray.CreateInstance(GETDOTNETTYPE(Object),1);
      ParamArray.SetValue(NewClipboardText,0);

      MethodInfo.Invoke(Object, ParamArray);
    END;

    BEGIN
    END.
  }
}

By using Reflection, we build some .NET code inside NAV. Next we call the correct functions.

If you want to use this Codeunit, you merely call the SetClipboardText or GetClipboardText.


Viewing all articles
Browse latest Browse all 7

Latest Images

Trending Articles



Latest Images