Laden...

Forenbeiträge von Tsuyo Ingesamt 20 Beiträge

16.05.2011 - 14:37 Uhr

Hi,
Danke für die Antworten. Ich hab jetzt einfach zwei voids geschrieben die dann alles Handlen was benötigt wird. Die werden dann von den overrides aufgerufen.
Da diese overrides nicht aufgerufen werden, hab ich einfach die Mouse Events von der Picturebox Aboniert. Nun geht alles Wunderbar.

Danke nochmals 😃

15.05.2011 - 23:09 Uhr

Hallo, ich schreibe gerade einige Controls und hab damit so kleine Probleme.
In einem Control überschreibe ich MouseUp und MouseDown.
Wenn ich das Control als Childcontrol meiner Form setze, werden diese auch aufgerufen. Jetzt habe ich aber mehrer Controls untereinander:

Form->EigenesControl->PictureBox->ControlMitEvents

Das ControlMitEvents löst nun keine Events mehr aus, obwohl ich auf das Control klicke. Hat jemand eine Idee wieso das passiert?

Wenn ich mir jetzt zwei public Funktionen schreibe, die dann das Event aufrufen, funktioniert es. Ist aber natürlich nicht Sinn der Sache.

Grüße

11.01.2011 - 19:30 Uhr

Hallo, zurzeit schreibe ich einen kleinen Wrapper für meine G15.
Da ich ungern neben meiner Library 100 andere libs mitschicken will, schreibe ich mir halt selber eine kleine USB-Verbindung.
Mein Problem ist, es läuft auf 32Bit, auf 64Bit aber leider nicht.

Meine DllImports sehen so aus:


class Native
        {
            [FlagsAttribute]
            public enum DiGetClassFlags : int
            {
                DIGCF_DEFAULT = 0x00000001,  // only valid with DIGCF_DEVICEINTERFACE
                DIGCF_PRESENT = 0x00000002,
                DIGCF_ALLCLASSES = 0x00000004,
                DIGCF_PROFILE = 0x00000008,
                DIGCF_DEVICEINTERFACE = 0x00000010,
            }

            [StructLayout(LayoutKind.Sequential)]
            public struct SP_DEVICE_INTERFACE_DATA
            {
                public Int32 cbSize;
                public Guid interfaceClassGuid;
                public Int32 flags;
                private UIntPtr reserved;
            }

            [StructLayout(LayoutKind.Sequential)]
            public struct SP_DEVINFO_DATA
            {
                public uint cbSize;
                public Guid ClassGuid;
                public uint DevInst;
                public IntPtr Reserved;
            }

            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
            public struct SP_DEVICE_INTERFACE_DETAIL_DATA
            {
                public UInt32 cbSize;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
                public string DevicePath;
            }

            [StructLayout(LayoutKind.Sequential)]
            public struct HIDD_ATTRIBUTES
            {

                public Int32 Size;
                public Int16 VendorID;
                public Int16 ProductID;
                public Int16 VersionNumber;

            }


            [DllImport("setupapi.dll", CharSet = CharSet.Auto)]
            public static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid, [MarshalAs(UnmanagedType.LPTStr)] string Enumerator, IntPtr hwndParent, DiGetClassFlags Flags);

            [DllImport("setupapi.dll", CharSet = CharSet.Auto)]
            public static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid, IntPtr Enumerator, IntPtr hwndParent, DiGetClassFlags Flags);
            [DllImport("setupapi.dll", CharSet = CharSet.Auto)]
            public static extern IntPtr SetupDiGetClassDevs(IntPtr ClassGuid, string Enumerator, IntPtr hwndParent, DiGetClassFlags Flags);

            [DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
            public static extern bool SetupDiDestroyDeviceInfoList(IntPtr hDevInfo);
            [DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
            public static extern Boolean SetupDiEnumDeviceInterfaces(IntPtr hDevInfo, IntPtr s, ref Guid interfaceClassGuid, UInt32 memberIndex, ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData);
            [DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
            public static extern Boolean SetupDiGetDeviceInterfaceDetail(IntPtr hDevInfo, ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData, ref SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData, UInt32 deviceInterfaceDetailDataSize, out UInt32 requiredSize, ref SP_DEVINFO_DATA deviceInfoData);
            [DllImport("hid.dll", SetLastError = true)]
            public static extern void HidD_GetHidGuid(ref Guid hidGuid);

            [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
            public static extern IntPtr CreateFile(
               string fileName,
               [MarshalAs(UnmanagedType.U4)] FileAccess fileAccess,
               [MarshalAs(UnmanagedType.U4)] FileShare fileShare,
               IntPtr securityAttributes,
               [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
               int flags,
               IntPtr template);

            [DllImport("hid.dll", SetLastError = true)]
            public static extern Boolean HidD_GetAttributes(IntPtr HidDeviceObject, ref HIDD_ATTRIBUTES Attributes);

            [DllImport("hid.dll")]
            public static extern bool HidD_SetFeature(IntPtr HidDeviceObject, ref byte lpReportBuffer, int ReportBufferLength);
            [DllImport("hid.dll")]
            public static extern bool HidD_GetFeature(IntPtr HidDeviceObject, ref byte lpReportBuffer, int ReportBufferLength);


        }

Hier ist mein Code für das finden der USB-Geräte:
Es scheint so, als ob die while garnicht ausgeführt wird. Also "Native.SetupDiEnumDeviceInterfaces" false zurück gibt. Da ich leider kein 64Bit System habe, ist es schwer zu debuggen (Deswegen auch die ganzen MessageBoxen).
Um's kurz zu fassen, die Guid ist Valide, ich bekomme bei Native.SetupDiGetClassDevs einen Validen Pointer und Marshal.SystemDefaultCharSize ist bei 32 und 64 Bit gleich -> "2".


public Device(string DeviceString) {
                Guid Ident = new Guid();
                Native.HidD_GetHidGuid(ref Ident);
                MessageBox.Show(Ident.ToString());
                IntPtr Devices = Native.SetupDiGetClassDevs(ref Ident, IntPtr.Zero, IntPtr.Zero, Native.DiGetClassFlags.DIGCF_PRESENT | Native.DiGetClassFlags.DIGCF_DEVICEINTERFACE);
                MessageBox.Show(Devices.ToString());
                Native.SP_DEVINFO_DATA SP_DEVINFO = new Native.SP_DEVINFO_DATA();
                SP_DEVINFO.cbSize = (uint)Marshal.SizeOf(SP_DEVINFO);

                Native.SP_DEVICE_INTERFACE_DATA SP_DATA = new Native.SP_DEVICE_INTERFACE_DATA();
                SP_DATA.cbSize = Marshal.SizeOf(SP_DATA);

                Native.SP_DEVICE_INTERFACE_DETAIL_DATA SP_DETAIL_DATA = new Native.SP_DEVICE_INTERFACE_DETAIL_DATA();
                SP_DETAIL_DATA.cbSize = (uint)(4 + Marshal.SystemDefaultCharSize);
                
                MessageBox.Show("4 + Marshal.SystemDefaultCharSize = " + (4 + Marshal.SystemDefaultCharSize).ToString());

                uint count = 0;

                
                while (Native.SetupDiEnumDeviceInterfaces(Devices, IntPtr.Zero, ref Ident, count, ref SP_DATA)) {
                    uint size = 0;
                    Native.SetupDiGetDeviceInterfaceDetail(Devices, ref SP_DATA, ref SP_DETAIL_DATA, 600, out size, ref SP_DEVINFO);
                    IntPtr CFile = Native.CreateFile(SP_DETAIL_DATA.DevicePath, FileAccess.ReadWrite, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, 0, IntPtr.Zero);

                    if (CFile.ToInt32() != -1)
                    {
                        Native.HIDD_ATTRIBUTES Attributes = new Native.HIDD_ATTRIBUTES();
                        Native.HidD_GetAttributes(CFile, ref Attributes);

                        MessageBox.Show(SP_DETAIL_DATA.DevicePath);

                        if (SP_DETAIL_DATA.DevicePath.Replace("#{" + Ident.ToString() + "}", String.Empty).Contains(DeviceString)) {
                              //  UsbHandle = CFile;
                            //break;
                        }
                        
                    }
                    
                    count++;
                }

                Native.SetupDiDestroyDeviceInfoList(Devices);

            }

Hat einer von euch 'ne Idee woran es liegen könnte?

MfG

08.01.2011 - 18:50 Uhr

*Gähn

Also, es lag an der Library, Diese erstellte bei einigen "Fehlern" eine neue Bitmap.
Ich schreib mir einfach selber ne kleine Library.

Schonmal Danke für die Hilfe 😉

08.01.2011 - 13:25 Uhr

Hi, hab ich getan. Vielleicht bin ich einfach zu sau übermüdet, und raff einfach gerade garnichts.

Ich habe jeweils in der User Klasse die ich als "You" Instanziert habe, eine Bitmap Property hinzugefügt, wo ich die Bitmap von dem Plugin abspeichere. Als kleiner Test halt. Jedoch ist der Ramverbrauch immernoch ~~16%

08.01.2011 - 13:03 Uhr

Hi, ganz genau weiss ich nicht.
Ich nutze eine Externe Library die mir das zeichnen auf eine G19/G15 ermöglicht.
Mir wird nur das Gdi Event gegeben.

" void LCD_GdiUpdate(object sender, GammaJul.LgLcd.GdiDrawingEventArgs e) "

08.01.2011 - 12:59 Uhr

Hey, habs auf 60 ms geändert. Hat jedoch kaum auswirkungen.
Ich hab natürlich weiter gesucht, ".NET Memory Profiler" gefunden und mal drauf gehauen.

Real-Time zeigt mir die Instances an. Und Tadaa es steigt, steigt und steigt. Bis der GC wohl das ganze zeugs aufräumt. Geht bis an die 13'000.

Den Setter hab ich rausgenommen, und die Bitmap in einer Variable gespeichert die ich nur zurück gebe 😉

Das Plugin wird natürlich nicht jedes mal neu Initialisiert ^^
Gruß

08.01.2011 - 12:49 Uhr

Woops. Natürlich meinte ich Instanz. Hab heute so gut wie garnicht geschlafen. ^^

Hab das Plugin soweit so abgeändert:


        Bitmap Icon_Cached = null;

        public Bitmap Icon
        {
            get { if (Icon_Cached == null) Icon_Cached = Properties.Resources.Icon; return Icon_Cached; }
        }

Änderungen konnte ich soweit nicht erkennen : /

08.01.2011 - 12:39 Uhr

Heyho, ich schreibe gerade ein Pluginsystem für mein Programm.
Ich zeichne alle 10 Millisekunden Bilder auf eine Bitmap:


e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
            e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            e.Graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.GammaCorrected;

         //   You.SelectedPlugin.RequestImage(ref e);

            int x = 0, y = 0;
            for (int i = 0; i < You.Plugins.Count; i++) {

                if (i == 4 || i == 8 || i == 12 || i == 16)
                {
                    y += 70;
                    x = 0;
                }
                e.Graphics.DrawImage(You.Plugins[i].Icon, new Rectangle(x, y, 64, 64), new Rectangle(0, 0, 64, 64), GraphicsUnit.Pixel);
                    // Debug.WriteLine(i + " :"  + x + " " + y +" " + You.Plugins.Count); 
                x += 70;

                
            }

Crappy if, und so weiter.
Das Icon ist 64x64 groß und steckt in den Ressourcen der DLL.

Das Interface sieht so aus:


    public interface Plugin
    {
...
        Bitmap Icon { get; set; }
...
    }

Und naja, das Plugin ist dann halt so aufgebaut:



...
        public Bitmap Icon
        {
            get { return Properties.Resources.Icon; }
            set {}
        }
...

Kann mir einer sagen warum das über 20% Ram frisst?
Liegts an Interfaces? Wenn ich ein Bild von dem "Host-Programm" 12 mal Anzeige, habe ich diesen speicherverbrauch nicht.

Kann mir da einer bitte helfen?^^ Ich habdie befürchtung das "return Properties.Resources.Icon" immer eine neue Bitmap Distanz erstellt und mir deswegen alles 'putt macht.

Grüße

10.08.2010 - 12:33 Uhr

Hi herbivore,
Danke für deine Antwort. Ich habs gelöst bekommen. Ich dachte der erste Parameter im Invoke wäre schon der erste Parameter in der Funktion.


                        Funktionen[i].Type.GetMethod("box", BindingFlags.Public | BindingFlags.Static).Invoke(null, new Object[] { "Hi" });

Funktioniert nun 😃

10.08.2010 - 12:07 Uhr

Hi, ich schreibe gerade ein kleines Plugin System für mein Programm. Das Laden usw Funktioniert soweit. (Ich hab es aus einem etwas älteren Projekt von mir. Jedoch habe ich da Lua als "Funktionsaufrufer" genutzt).
Nun, Ich lade so die Dlls:


        public class Functions
        {
            public List<MethodInfo> Methoden;
            public FileInfo file;
            public Type Type;
            public Functions(List<MethodInfo> info, FileInfo f, Type t)
            {
                Methoden = info;
                f = file;
                Type = t;
            }
        }
        public static List<Functions> Funktionen = new List<Functions>();

DirectoryInfo dinfo = new DirectoryInfo("plugins/");
            FileInfo[] files = dinfo.GetFiles("*.dll");
            foreach (var f in files)
            {
                string p = f.FullName;
                Assembly SampleAssembly;
                Type[] Types = null;
                Type modul = null;

                SampleAssembly = Assembly.LoadFile(p);
                Types = SampleAssembly.GetTypes();
                foreach (Type i in Types)
                {
                    if ((i.Name == "Plugin"))
                    {
                        modul = i;
                        break;
                    }
                }
                if (modul != null)
                {
                    ObjectHandle a = Activator.CreateInstanceFrom(p, modul.FullName);
                    MethodInfo[] functionen = null;
                    functionen = (System.Reflection.MethodInfo[])modul.GetMethods();
                    string[] funktionen = ((string[])modul.GetMethod("Functions").Invoke(null, null));

                    List<MethodInfo> m = new List<MethodInfo>();

                    for (int i = 0; i <= funktionen.Length - 1; i++)
                    {
                        m.Add(modul.GetMethod(funktionen[i]));
                    }
                    Funktionen.Add(new Functions(m, f, modul));
                }
            }

Wenn ich nun eine Methode in meiner Dll aufrufen möchte, die keine Parameter hat:


Funktionen[i].Type.GetMethod("box", BindingFlags.Public | BindingFlags.Static).Invoke(null,null);

Funktioniert es. In meiner PluginDll sieht die function so aus:


        public static void box()
        {
            MessageBox.Show("");
        }

Die MessageBox kommt, alles geht. Wenn ich nun aber ein Parameter übergeben will:


//DLL
        public static void box(string a)
        {
            MessageBox.Show(a);
        }
//PROG
Funktionen[i].Type.GetMethod("box", BindingFlags.Public | BindingFlags.Static).Invoke("asd",null);

Bekomm ich eine Parameter Anzahl Konflikt Exception.
Kann mir einer erklären wieso das Problem auftritt?

Grüße

11.07.2010 - 00:11 Uhr

Alles klar 😉

Danke für die hilfreichen Antworten!

10.07.2010 - 22:30 Uhr

Klar weiss ich das, muss ja auch sein, sonst wird ja nicht aufs Display gezeichnet.

10.07.2010 - 21:35 Uhr

Hi, danke schonmal für die Antworten.
Der Backgroundworker macht nichts anderes als das:


        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            while (true) {
                try { 
					device.DoUpdateAndDraw();
                }
                catch (Exception) {                
                }
            }
        }

Damit lade ich ein Bild auf ein LCDbildschirm.

grüße

/Edit:
Scheint wohl die Dll zu sein die soviel frisst Oo Wenn ich DoUpdateAndDraw() auskommentiere ist die CPU immer auf 0.
Externe "LibFixes" Gibts wohl nicht oder?

/Edit²:
Okay, es war doch nicht die Lib, wenn ich ein Sleep in die While mache, ist die CPU immer auf 0. Kann mir jemand erklären wieso?

10.07.2010 - 18:13 Uhr

Moin, ich schreibe gerade ein kleines Programm das mit Gdi arbeitet, das wird in einem Backgroundworker per while immerwieder wiederholt.
Jedoch nimmt dafür mein Programm mehr als 50% (Laut Taskmamanger) meines Cpu's ein. Und das soll natürlich nicht sein, woran kann das liegen? Gibts Tools die das Programm analysieren können und sagen wo und was so oft ausgeführt wird?

grüße

07.07.2010 - 17:01 Uhr

Sommerzeit ist Partyzeit, auch im Schwimmbad^^
Ich fahr Dirtbike, stehe immer 1Std früher auf und geh Joggen.

06.07.2010 - 22:16 Uhr

Hi, die funktionen geben meißtens Integer zurück, ich weiss nicht was Winamp genau versendet.
Der Typ ist gerade nicht mehr Online, somit kann ich das mit dem GetLastWin32Error(), erst morgen versuchen. Danke schonmal für deine Hilfe.

06.07.2010 - 21:36 Uhr

Hallo Leute,
ich hab gerade ein Problem mit meinem Programm. Und zwar wird dort sehr viel mit SendMessage gearbeitet (Winamp), unter 32 Bit geht alles. Jedoch sagt mir mein Kollege, das bei ihm nichts geht. Er hat 64Bit.
Kompiliert wird das Programm schon für X86
Woran könnte das liegen?
Meine SendMessage Signatur sieht so aus:


       [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
       public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

FindWindow:


       [DllImport("user32.dll")]
       public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

Und ansonsten wird SendMessage genutzt, wie es sollte. Wenn ihr noch Informationen braucht, liefer ich diese natürlich gerne nach

Ich hoffe auf Hilfe und bedanke mich schonmal 😃

28.05.2010 - 02:35 Uhr

2Tes Bild:

28.05.2010 - 02:33 Uhr

Hallo.
Ich bin relativ neu hier, hab schon öfters einige Threads hier angesehen, nun hab ich mich auch mal registriert 😉
Ich möchte euch ein OpenSource Projekt von mir vorstellen.
Es heisst G-Workstation und ist ein "Applet" bzw eine Applikation für die Tastaturen G15/G19 und dem gameboard G13.
Wie einige vielleicht wissen haben diese Lcd Bildschirme. Nun, mein Programm spricht diese an.
Es gibt genügend Benutzer ohne jegliche Kentnisse in einer Hochsprache (Vb,C# etc).
Somit sind sie auf Applets von irgendjemandem angewiesen. Aber ist es nicht viel "Cooler" sich selbst applets zu schreiben das noch total einfach ist? Möglich.
Für mein Applet habe ich 2 wichtige Dinge eingebaut:

1.) Lua Support. Jeder user kann wie er will in Lua sich seine eigenen Applets schreiben.
2.) Modul Support. Jeder user kann eigene Funktionen in .NET schreiben. Somit können Leute die nicht mit dem G15 / G19 Bildschirm klarkommen immernoch kleine Funktionen schreiben die sie im Luascript verwenden können.

Das ganze Script nutzt eine Art Events. Wie in C#!, falls z.b ein Knopf auf der Tastatur gedrückt wird, wird im Luascript eine bestimmte Funktion aufgerufen. Ist natürlich besser als immer im Timer den status zu überprüfen.. nicht war 😃?

Nun sehr lange Rede kurzer Sinn - Bilder sind im Anhang.

Das Luascript der beiden Previews sieht so aus:


pluginname = "PluginTest"
version = "1.0"
creator = "Tsuyo"
mail = "1@tsuyo.de"
light = 0

dofile("plugins/values")

-- WORK HERE :)
function draw()
	if keyboard() == 0 then
		drawtext(now("HH:mm:ss"),"8pxbus", 255, 0, 0, 0, 8, 0, 0, 500, 500)
		drawtext(now("dd.MM.yyyy"),"8pxbus", 255, 0, 0, 0, 8, 110, 0, 500, 500)
		drawline(255,0,0,0,0,8,LCD_M_WIDTH,8)
		if getshuffle() == WAMP_STATUS_SHUFFLE_ON then
		drawtext("Shuffle is enabled","8pxbus", 255, 0, 0, 0, 8, 0, 10, 500, 500)
		else
		drawtext("Shuffle is not enabled","8pxbus", 255, 0, 0, 0, 8, 0, 10, 500, 500)
		end
		if getrepeat() == WAMP_STATUS_REPEAT_ON then
		drawtext("Repeat is enabled","8pxbus", 255, 0, 0, 0, 8, 0, 20, 500, 500)
		else
		drawtext("Repeat is not enabled","8pxbus", 255, 0, 0, 0, 8, 0, 20, 500, 500)
		end
		drawtext(song(),"8pxbus", 255, 0, 0, 0, 8, 0, 30, 500, 500)
		drawtext(tomin(songlength()),"8pxbus", 255, 0, 0, 0, 8, 100, 37, 500, 500)
		drawtext(tomin(songpos()),"8pxbus", 255, 0, 0, 0, 8, 0, 37, 500, 500)
	else
		fillrectangle(255,255,0,0,0,0,340,50)
		drawtext(now("HH:mm:ss"),"Arial",255,255,255,255,20,0,0,100,100)
		drawline(255,255,255,255,0,0,340,50)
		drawline(255,255,255,255,340,-2,0,50)
		drawtext("Testplugin NR:1","Arial",255,255,255,255,20,0,20,350,100)
	end
end

function buttonchanged(b)
	if b == "Button3" then
		if light < 2 then
			light = light + 1
		else
			light = 0
		end
		DisplayLight(light)
		KeyboardLight(light)
	end
end

function closing()
--box("Closing!")
end

function closed()
--box("Closed!")
end

Die Funktionen closing und closed werden im FormClosing, FormClosed Event aufgerufen.
Buttonchanged() wird aufgerufen wenn eine LcdTaste gedrückt wird.
Draw() wird aufgerufen, wenn neu aufs Display gezeichnet werden soll.

Hier ist der SourceForge link:
https://sourceforge.net/projects/g-workstation/

Was nun noch kommen wird:

  • Ein Designer, selbst für die ganz unerfahrenen 😉
  • Mehr Module, Je mehr Funktionen man im Luascript nutzen kann, desto besser 😃
  • Eine gute Dokumentation, bis jetzt ist es eher Mager Dokumentiert. Kommentare stehen übrigens jetzt schon über den Funktionen. Ich muss mich da mal in SandCastle einarbeiten.

Naja ich denke ich hab hier genug geschrieben. Freu mich über Feedback.

Grüße