2013-10-18 10 views
23

Ich habe eine Menge Fragen dazu, aber niemand erklärt, wie ich das nutzen kann.Wie benutzt man [DllImport ("")] in C#?

Ich habe dies:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 
using Microsoft.FSharp.Linq.RuntimeHelpers; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 
using System.IO; 

public class WindowHandling 
{ 
    public void ActivateTargetApplication(string processName, List<string> barcodesList) 
     { 
      [DllImport("User32.dll")] 
      public static extern int SetForegroundWindow(IntPtr point); 
      Process p = Process.Start("notepad++.exe"); 
      p.WaitForInputIdle(); 
      IntPtr h = p.MainWindowHandle; 
      SetForegroundWindow(h); 
      SendKeys.SendWait("k"); 
      IntPtr processFoundWindow = p.MainWindowHandle; 
     } 
} 

Kann mir jemand helfen zu verstehen, warum es mir einen Fehler auf der DllImport Linie und auf der Linie public static gibt?

Hat jemand eine Idee, was kann ich tun? Danke.

+1

Welcher Fehler ist es? –

+0

Es gibt mehrere Probleme zusätzlich zu dem, was @vcsjones erwähnt hat. Haben Sie User32.dll, wo Sie dies verwenden? Und überprüfen Sie auch den Ort, an dem Sie die [DllImport] -Anweisung geschrieben haben. Es ist ein falscher Ort. –

+2

@ PM. User32.dll ist eine ziemlich standardmäßige Win32-DLL, die immer in SysWow64 oder System32 enthalten sein wird, daher sollte es kein Problem geben, sie zu finden. Es könnte den * falschen * finden, wenn es eine andere DLL mit dem gleichen Namen gibt, die in der Suchsequenz "näher" ist, aber das würde bei den meisten Programmen Unheil bringen. – vcsjones

Antwort

48

Sie können keine lokale Methode extern innerhalb einer Methode oder einer anderen Methode mit einem Attribut deklarieren. Verschieben Sie Ihren DLL-Import in die Klasse:

using System.Runtime.InteropServices; 


public class WindowHandling 
{ 
    [DllImport("User32.dll")] 
    public static extern int SetForegroundWindow(IntPtr point); 

    public void ActivateTargetApplication(string processName, List<string> barcodesList) 
    { 
     Process p = Process.Start("notepad++.exe"); 
     p.WaitForInputIdle(); 
     IntPtr h = p.MainWindowHandle; 
     SetForegroundWindow(h); 
     SendKeys.SendWait("k"); 
     IntPtr processFoundWindow = p.MainWindowHandle; 
    } 
} 
+22

Sie müssen auch "System.Runtime.InteropServices" in Microsoft Visual Studio verwenden – Cullub

+0

Sie müssen auch 'System.Diagnostics' verwenden, um das Process-Objekt zu verwenden – Wigwam