@ Big Al: NAudio macht irgendwie auch nicht das was ich will.. Es kann zwar die Stärke anzeigen, jedoch nur wenn man eine Audio-Datei angibt - und nicht über den Windows-Output ... :S
Oder ich bin einfach zu dumm, und habe da was übersehen/überlesen?
@ Gwinn: Ich hab das Sample getestet, aber das Teil hat mir nur anezeigt, was passiert, wenn das Mikro einen Ton erfasst...? :(
Das ist ja das Problem, ich mag nicht dn Input abfragen, sondern den Output. Ich mag das Spektrum, wie es (im Moment der Abfrage) von Windows zur Soundkarte geschickt wird...
Ich bin derzeit auf der Suche nach einer Möglichkeit, alles, was zur Soundkarte geschickt wird, abzufragen. Ich mag einen simplen Audio-Visualizer basteln (jedoch als Rainmeter-Plugin).
Es geht also darum, das Spektrum auf die ganzen einzelnen Frequenzen aufzusplitten, und deren Stärke als Balken darzustellen... Jedoch finde ich keine Möglichkeit, das komplette Audio-Spektrum ohne zusätzliche Libraries (Ich wäre mit WinAPI, und DirectX zufrieden, Fremd-Libraries will ich eigentlich nicht verwenden) abzufragen. :(
Hat vllt. von euch jemand eine Idee?
Vielen Dank im Vorraus!
Lg Marc
PS: SuFu und Google natürlich schon benutzt! Hab aber nur Möglichkeiten gefunden, mit DirectSound vom Mikro aufzunehmen. Mehr aber leider auch nicht.
@Herbivore: Wenn die Mitarbeiter davon wissen, ist dass doch legal, oder?
Jedenfalls gibt es Libraries, mit denen du an den Verlauf vom Internet Explorer kommst, wie es mit dem Starten/Beenden aussieht, kann ich dir nicht sagen.
Also, ich würde das mit nem Timer, dem Paint-Event und Invalidate() realisieren...
Z.B. so:
private Timer timer1;
private IContainer components;
public Form1()
{
InitializeComponent();
// Set the value of the double-buffering style bits to true.
this.SetStyle(ControlStyles.DoubleBuffer |
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint,
true);
this.UpdateStyles();
}
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.timer1 = new System.Windows.Forms.Timer(this.components);
this.SuspendLayout();
//
// timer1
//
this.timer1.Enabled = true;
this.timer1.Interval = 5;
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
//
// Form1
//
this.ClientSize = new System.Drawing.Size(512, 384);
this.Name = "Form1";
this.Text = "Main Form";
this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
this.ResumeLayout(false);
}
int x = 512;
int y = 0;
private void timer1_Tick(object sender, EventArgs e)
{
x--;
if (x == 0)
timer1.Stop();
this.Invalidate(false);
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics graphics = e.Graphics;
graphics.DrawImage(PaintSample.Properties.Resources.Test, new Point(x, y));
}
Ich habe dir das Sample angehängt. Hoffentlich hilft es dir!
Dein Code war wirklich etwas... unperformant.
Das liegt z.B. auch daran, dass du bei jedem Update das Bild neu lädst.
Beachte auch, dass du mehr als einfaches DoubleBuffer = true brauchst... Siehe Konstruktor ;)
Ich habe es nun soweit gebracht, dass das icon ganz links (und da befindet es sich auch direkt nachdem es gestartet wurde...) ganz nach rechts zu verschieben.
Code dazu:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace PowerMonitor
{
public class Win32
{
public enum ToolbarMessages : uint
{
WM_USER = 0x0400,
TB_GETBUTTON = (WM_USER + 23),
TB_BUTTONCOUNT = (WM_USER + 24),
TB_MOVEBUTTON = (WM_USER + 82)
}
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);
// For Windows Mobile, replace user32.dll with coredll.dll
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, IntPtr windowTitle);
private static IntPtr FindTrayToolbarWindow()
{
IntPtr hWnd = FindWindow("Shell_TrayWnd", null);
if (hWnd != IntPtr.Zero)
{
hWnd = FindWindowEx(hWnd, IntPtr.Zero, "TrayNotifyWnd", IntPtr.Zero);
if (hWnd != IntPtr.Zero)
{
hWnd = FindWindowEx(hWnd, IntPtr.Zero, "SysPager", IntPtr.Zero);
if (hWnd != IntPtr.Zero)
{
hWnd = FindWindowEx(hWnd, IntPtr.Zero, "ToolbarWindow32", IntPtr.Zero);
}
}
}
return hWnd;
}
public static void MoveFirst()
{
IntPtr hWnd = FindTrayToolbarWindow();
int index = 0;
UInt32 count = (UInt32)SendMessage(hWnd, (uint)ToolbarMessages.TB_BUTTONCOUNT, 0, 0);
SendMessage(hWnd, (uint)ToolbarMessages.TB_MOVEBUTTON, index, (int)count);
}
}
}
Ja, das ist mir ja auch klar. Ich weiß aber nicht wie, vor allem nicht, weil das Programm kein Windows-Dienst ist, sondern einfach ein als [STAThread] markiertes Programm, das statt normaler GUI einfach nur ein NotifyIcon lädt. Es sollte möglichst einfach sein, deshalb habe ich es so gemacht, dass man die runtergeladene exe einfach nur in den Autostart kopieren muss damit es funktioniert...
Aber es ist auf jeden Fall möglich, die Symbole nachträglich noch zu verschieben. Es gibt einige Programme die das ermöglichen, darunter z.B. "Taskbar shuffle". Ich habe mich schon per Mail an den Programmierer gewandt, jedoch hat er nicht geantwortet, und ich wüsste nicht, wen ich sonst fragen sollte, außer eine Riesen-Community :)
Vllt. weiß ja wirklich jemand wie man sowas machen kann... :)
Lg Marc
Edit: Bitte entschuldigt wenn ich die nächsten drei Tage nicht antworte, da ich nicht zu Hause bin. Mal sehen ob ich ins Internet komme...
Das Programm ist eine systray-App. Es zeigt einfach nur den Akku-Status an, jedoch viel detaillierter als Windows (und braucht gerade mal 9MB im Ram und hat max. 10 Sekunden Reaktionszeit).
Da normalerweise die Batterie-Anzeige in Windows als erstes geladen wird, ist sie im System-Tray auch ganz rechts. Mein Symbol kullert allerdings immer irgendwo herum, deswegen möchte ich es beim AppStart ganz nach rechts, also an die erste Position verschieben, damit es auch sichtbar ist. Ich habe allerdings keine Idee, wie ich das machen soll.
Ich hoffe dass ihr mir jetzt helfen könnt, bitte entschuldigt dass ich bisher etwas "schwammig" gefragt habe... :)
das ist ja das Problem... Ich finde keinen Code dazu, wie man sowas bewerkstelligen könnte. Ich habe einfach keine Ahnung, deswegen habe ich nochmal gefragt... Und da ich keinen Code habe, weiß ich auch nicht was ich davon zeigen könnte ;)
vielen Dank erstmal für deinen Tipp zero_x, ich bin schon eifrig am suchen, das meiste was ich bisher jedoch gefunden habe hatte nur mit dem bekommen der Werte, und nicht mit dem setzen der Werte zu tun...
Ich suche derzeit nach einem Weg, ein NotifyIcon "ganz nach rechts" zu verschieben.
Es soll die Windows-Batterieanzeige ersetzen, da ich die (in XP) einfach nur zum kotzen finde. Das Programm kann hier angesehen/runtergeladen werden. (Einfach die exe starten, man kann es dann mit der rechten Maustaste beenden).
Es funktioniert schon alles, jedoch ist es an der falschen Position. Das Ausblenden des Originals kann man per Hand vornehmen. Nun muss nur noch meines richtig angezeigt werden, und nicht irgendwo.
Mir ist klar, dass das nur (wenn überhaupt) über die Windows-API funktioniert.
Hat jemand von euch vllt. eine Idee, wie das funktionieren könnte?
Es hat einwandfrei funktioniert. Nur zwei doofe Häckchen...
Trotzdem danke
Hättest du das nicht geschrieben, hätte ich nicht so schnell in diese Einstellungen geschaut, und den Fehler in meinem Programm gesucht 8o
Ich habe mir nochmal die Berechtigungen angeguckt, und dabei ist mir folgendes aufgefallen:
Der Benutzer hatte bei den Berechtigungen ÜBERALL ein häckhen. Somit nicht nur bei db_datareader/-writer, sondern auch bei db_denydatareader/-writer... :(
Man, bin ich dämlich. Aber richtig testen kann ich das erst morgen, wenn ich wieder dort bin. Danke trotzdem für die Hilfe, ich werde morgen nochmal bescheid geben, ob alles geklappt hat!
Ich habe derzeit ein kleines Problem. Ich sollte für einen Kunden ein kleines Programm schreiben, dass mit dem Microsoft SQL Server (v 8.0 --> Also 2000) auf einem Windows Server 2003 gewisse Daten speichern und wieder auslesen kann.
Bei mir zuhause funktioniert das alles ja recht gut, hier läuft aber nur der Standard 2008 SQLEXPRESS, der beim VS 2010 dabei ist. Aber beim Kunden rennt eine richtige SQL-Datenbank, wo man logischerweise mit Benutzername und Passwort arbeiten muss.
Also, habe ich als ConnectionString nun "Server: SERVER; Database: DataStorage; User Id=myUser; password=p@ssword". Das connecten und so funktioniert super.
Und wenn ich dann folgendes machen möchte: "SELECT * FROM USERS" (die Tabelle existiert, hat alle nötigen Spalten und und und) bekomme ich dann folgende Exception:
"Die SELECT-Berechtigung wurde für das USERS-Objekt, DataStorage-Datenbank, Besitzer 'myUser' verweigert.
Hat irgendjemand von euch eine Ahnung, was man dafür umstellen muss?
Der Benutzer 'myUser' hat alle Rechte auf dieser Tabelle.
Hoffe sehr dass mir jemand helfen kann, bin am verzweifeln... :(
Für die fortlaufende Versionsnummer musst du in der AssemblyInfo.cs in folgendem Abschnitt:
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
//
// Hauptversion
// Nebenversion
// Buildnummer
// Revision
//
// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
// übernehmen, indem Sie "*" eingeben:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("2.0.0.0")]
[assembly: AssemblyFileVersion("2.0.0.0")]
AssemblyVersion("2.0.0.0") auf AssemblyVersion("2.0.0.*") oder so ändern. Steht ja eh in den Kommentaren ;)
Ist schon klar, dass es nicht während dem Transfer passiert, aber wie macht das dann z.B. FileZilla wenn es eine 600MB Datei hochladen muss? Das dauert doch auch Ewigkeiten und es muss die Verbindung aufrecht erhalten...?
Nein, mit FileZilla funktioniert es ja. FileZilla wird ja auch nix anderes machen, als einen eigenen Befehl zur Aufrechterhaltung der Verbindung zu senden. Und genau den suche ich :)
Ich habe eine Frage, und zwar habe ich derzeit ein Problem folgender FtpLibrary: http://ftplibrary.codeplex.com/
Ich habe den Code nur ein bißchen aufgeräumt (Bezeichner verändert, und XML-Kommentare hinzugefügt)
Ich kann super damit arbeiten, mein Programm kommt damit auch sehr gut zurecht. Wenn ich jedoch eine größere Datenmenge auf den Server laden muss (Größere Datenmenge soll heißen mehrere Dateien, ca. 500 Bilder), dann macht der ca. 5 Minuten seine Arbeit, danach geht nichts mehr. Es kommt keine Exception etc., der Client bleibt einfach hängen...
Ich bin mir sehr sicher dass es irgendwas damit zu tun hat, dass der Client kein "Ich bin noch da" sendet, ich weiß aber nicht wie der dafür nötige Befehl dafür heißt. Kann mir da jemand helfen? Google/Wikipedia hat mich nicht wirklich weitergebracht...
Ansonten probier doch einfach mal diese FTP-Library, ich nutze die auch, und bin SEHR zufrieden damit, auch was die Geschwindigkeit angeht... die Library "kommuniziert" wie z.B. FileZilla mit dem Server...
Das heißt aber auch, dass du die ChangeWorkDirecotry Methode aufrufen musst und so, dass das funktioniert... Du gibst der Library einen Befehl nach dem anderen an, also Connect, Login, ChangeWorkDirectory, UploadFile, etc. etc...
Ich hab es jetzt einfach mit einem try/catch bei Assembly.Load gemacht... Was besseres ist mir nicht eingefallen^^ Auf jeden Fall funzt es jetzt, trotzdem danke..