Kann es sein, dass das Slide in der Slideshow nicht den Ganzen Screen füllt?
Dann musst du die Startkoordinate des Slides rausfinden.
Ist z.B. bei IE auch so. Das Fenster mit Inhalt hat nicht die gleiche grösse, wie das IE Fenster selber. Also muss man die Startkoordinate des Childwindows rausfinden und kann von da weiter auf die Kontrolls.
Hoffe, dies hilft dir weiter.
Gruss Roger
Dies tönt wieder einmal nach einem Bot. Aber egal.
Du musst erst mal rausfinden, ob es eine Windows oder winw WPF Anwendung ist.
Bei einer Klasichen Windows Anwendung, musst du wie Cat scho geschrieben hat, mit EnumWindows Arbeiten.
Wenn es eine WPF Anwendung ist, kannst du mit AutomationElement arbeiten.
Für beide Varianten gibt es alles bei Google.
Google liefert sogar am Abend und am Wochenende.
Gruss Roger
StartMenu durchsuchen?
Da gibt es das allgemeine und für jeden User ein eigenes, welche, wenn du auch durchsuchen muss, aber du ev. keine Rechte hast.
Hallo akunz
Arbeite auf dem SQL Server mit einem Trigger.
Dieser startet, ja nach definition, immer, wenn ein neuen Eintrag in die DB kommt.
Aus dem Trigger kannst du dann ein Programm starten, oder die Daten gleich auf SQL ebene weiter verarbeiten.
Gruss Roger
Für den IE Cache kann man foldende Befehle verwenden.
echo Clear Temporary Internet Files:
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8
echo Clear Cookies:
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 2
echo Clear History:
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 1
echo Clear Form Data:
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 16
echo Clear Saved Passwords:
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 32
echo Delete All:
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255
echo Delete All w/Clear Add-ons Settings:
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 4351
Gruss Roger
Hallo varron
warum start3est du eigentlich psshutdown nicht direkt?
Gruss Roger
Hallo varron
So viel ich weiss, musst du, wenn du über cmd.exe gehst ein /c voranstellen, damit das Kommando ausgeführt wird.
Also einfach ein /c vor psshutdown.
Gruss Roger
Wenn du den standart Browser anzapfen musst, dann schau mal AutoIt an.
Damit kannst du das machen. Es gibt auch ein C# plugin.
Gruss Roger
Hallo Steffen2012
Hab mal bei mir unter SYSTEM\CurrentControlSet\Enum\DISPLAY geschaut.
Da habe ich 5 monitore drin. (Default, Dell, Dell, HP, HP)
Zur Zeit habe ich 2 HP Monitore, hatte aber mal 2 Dell Monitore.
Die Seriennummer finde ich in der Registry allerdings nicht.
Also würde das ganze bei uns nicht funktionieren.
Gruss Roger
Hallo mcdt
Wenn du über einen Printserver gehst, dann kannst du den Druckjob absetzen, auch wenn der Drucker nicht online ist.
Ansonsten Drucker infos auslesen und einen Ping absetzen, dann weisst, ob der Drucker am Netz ist. Danach kannst du auf den Drucker direkt, die Drucker infoas auselsen.
Gruss Roger
Je nachdem, wie die Monitora ngeschlossen sind, wirst due keine Seriennummer bekommen.
Bei VGA und HDMI bekommst du soviel ich weiss keine Seriennummer. Via Displayport ist es glaub Möglich.
Seriennummer ist oft ein, Geh zu Fuss und Schreib auf, Task.
Gruss Roger
Robocopy kannst du auch via Scheduled Task starten und bei den Optionen mitgeben, wie lange er Sync machen soll.
Kann es sein, dass das niemand weiss??
Exchange ist übrigens 2007.
Gruss Roger
Hallo Zusammen
Ich habe ein kleines Problem mit LDAP.
Ich kann ohne Problem alle Infos aus der AD auslesen.
Nun gibt es ja auf dem Exchange Server die möglichkeiten mehrere Mail Adressen zu hinterlegen.
Wie kann ich via LDAP alle mailadressen auslesen und nicht nur die Hauptadresse.
Vielen Dank für eure Infos.
Gruss Roger
Beim 64Bit gibt es ein Verzeichnis Programme(x86)
Gruss Roger
Ich habe mein Problem nun doch mit folgenden Code gelöst.
private void dgvGameInfo_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
{
if(e.ColumnIndex < 0 || e.RowIndex < 0)
{
return;
}
if (e.Button == MouseButtons.Right)
{
Point pmouse = dgvGameInfo.PointToClient(Control.MousePosition);
contextMenuStrip1.Show(dgvGameInfo, pmouse.X, pmouse.Y);
}
}
So bin ich mit dem Ergebins ganz zufrieden und habe im Moment auch keine Situation gefunden, wo etwas nicht stimmt.
Gruss RogerSt
Danke rongchaua für deine Lösung.
Die ist wirklich super einfach.
Weiss auch nicht, wesshalb ich es so kompliziert mache.
Da ich nicht sehr häufig programmiere, schaue ich immerwieder in altem Code, den ich mal geschrieben habe.
(was nicht immer das schlauste ist)
Und wesshalb ich nicht die ContextmenuStrip auf dem Datagridview selber gesetzt habe, das Frage ich mich jetzt auch mehr, werds aber so machen.
Gruss RogerSt
Hallo MotS
Das ist genau das, was ich gesucht habe.
Nun stimmt meine Positions berechnung.
VIELEN DANK.
Gruss RogerSt
Hallo Zusammen
Ich suche schon lange nach einer Lösung, die eigentlich einfach sein sollte, ich aber nicht hinkriege.
Leider habe ich auch mit Forumsuche und Google suche keine Lösung gefunden. (Vieleicht suche ichauch einfach Falsch)
Ich habe ein datagridview auf einer Form.
Nun schauen ich beim CellMouseUp event, wo die Maus steht und zeige dann das contextmenu an.
Ich berechne die Position anhand der sichtbaren Zellen.
Dies funktioniert auch gut.
Solange die erste Zelle ganz sichtbar ist.
Sobald diese nur noch zum Teil sichtbar ist, stimmt die Position der Contextmenus nicht mehr.
Weiss jemand, wie ich herausfinde, wie breit die erste Zelle ist?
Im Dateianhang habe ich noch ein Bild, wo es stimmt und eines, wos nicht stimmt.
Der Pfeil ist die Mausposition.
Bin für jeden Tip dankbar.
Gruss RogerSt
ich würde Robocopy nehmen
ist extrem flexibel.
man kann eine syncronisation machen und die nach Zeit und änderungen laufen lassen.
robocopy c:\daten\ g:\backup\ *.* /mir /mon:1 /mot:10
Hallo herbivore
Die Artikel: Warum mein Gui Blockiert und Teile Updaten, kenne ich.
Das problem ist ja eigentlich nicht, dass das GUI immer blockiert.
Das Gui blockiert nur die Animation, wenn das GUI, welches aus einer DLL aufgerufen wurde, in eine HTA application eingebunden wirde.
Sonst funktioniert alles problemlos aus VBS.
Ich habe ja auch shcon versucht das GUI via Backgroundworker zu aktualisieren.
Desshalb möchte ich nun das GUI nicht von VBS aus starten, sondern die Routine, die von VBS aufgerufen wird, soll einen neuen Thread starten und dieser Thread soll das GUI zeichnen.
Somit wäre dann ja auch egal, wenn VBS einen momentlang blockiert.
Sinn des GUI ist eine Reine Anzeige, dass man weiss, dass noch etwas läuft.
Es gibt nur 3 funktionen, die man von VBS aufrufen können soll.
1: GUI anzeigen
2: Gui Text update
3: Gui Schliessen
Also denke ich, ich habe es nicht mit den normalen "Warum Blockiert mein Gui" zu tun.
Oder denke ich vollkommen falsch??
Ich hoffe, dass man versteht, was ich meine.
Gruss Roger
Hallo zusammen
Ich versuche zur Zeit eine Form aus einer DLL zu kreieren, damit ich via VB Scribt ein Form habe um den Status anzuzeigen.
Dies ist noch nicht das Problem.
Ich registriere die dll mit regasm /codebase und kann dann in einem VB Script folgendes machen.
Dim tool
Dim oshell
Set oshell = CreateObject("Wscript.Shell")
Set tool = CreateObject("MeineDLL.CustomForm")
tool.Show("Waiting...")
Somit wir ein Form angezeigt, welches ich mit too.Update("neuer text") updaten kann.
In diesem Form habe ich eine gif animation.
Nun habe ich aber das Problem, dann unter gewissen Umständen die Animation stehen bleibt. z.B. wenn man in einer HTA Application neue HTML objekte erzeugt.
Um dies zu beheben, habe ich ein Formrefresh in einen Backgrounworker gepackt.
Leider hat dies aber nicht geholfen.
Nun habe ich die Idee, dass ich wenn ich tool.Show("") aufrufe einen neuen Thread kreiere und aus diesem Thread will ich dann das Form Zeichnen.
Da dann die Form in einem neuen Thread ist, sollte ja die Animation nicht mehr einfrieren.
Was ich im Moment nicht weiss, ist wie ich es am einfachsten bewerkstellige, dass ich den Text auf dem Form (welches ja in einem eigenen Thread läuft) update kann.
Oder kann ich in einen neun Thread gar kein Form kreieren?
Bin für jede Hilfe Dankbar.
Gruss Roger
Vielen dank für die Infos.
Genau sowas habe ich gesucht.
Schönen Tag noch.
Hallo Leute
Ich steh wiedermal auf dem Schlauch.
Folgendes Problem.
Ich will ein vbs verschlüsseln. (kein problem)
Wenn ich dann ein exe (welches in c# geschrieben ist) starte, will ich das verschlüsselte file einlesen und decrypten. (Dies ist auch noch kein problem)
Nun habe ich in einen Array das ganze file, so wie es als vbs ausgeführt werden könnte. Ich will das File aber nicht speichern, sondern direkt aus dem Speicher ausführen.
Bin dankbar für jeden Tip.
Gruss Roger
hallo rechner
Ich spreche immer von Vista mit Aktivem UAC.
unter vista kannst du in einer application eine andere application nur mit Adminrechten starten, wenn der erste Prozess schon Adminrechte hat.
Wenn also der User in der Admingruppe ist, dann kannst du einen neuen Prozess mit Adminrechten starten. sonst nicht.
Ich hatte das Problem, dass ich in einer Application Files in den Programmfile ordner kopieren wollte.
Ich habe keine andere Lösung gefunden, als einen Service schreiben (dieser läuft unter System rechten) und dann diesen mit den Daten füttern, was er von wo nach wo kopieren muss.
ja, ich weiss: Es gibt noch andere lösungen, aber diese finde ich noch umständlicher.
Ich hoffe, dies hilft dir weiter.
Wenn jemand weiss, wie ich, wenn der User keine Adminrechte hat, von einer Appication, die der User gestartet hat, einen neuen Prozess mit Adminrechten starten kann, dann bin ich sehr an der Lösung intressiert.
Gruss Roger
Ich habe eine Idee um das Problem zu lösen.
Ich versuche nun aus dem ersten exe (die mit Userrechten läuft) einen neuen Prozess mit Adminrechten zu starten.
Natürlich habe ich auch wieder das Resourcefile, damit UAC anzeigt, dass es Adminrechte braucht.
Ich starte den neuen Prozess mit folgendem Code.
Process pr = new Process();
ProcessStartInfo prs = new ProcessStartInfo();
prs.FileName = @"D:\KopierProzess\bin\Debug\KopierProzess.exe";
prs.Arguments = "";
prs.UserName = m_sAdminAccount;
prs.Password = m_sAdminPassword;
prs.Domain = m_sAdminAccountDomain;
prs.Verb = "runas";
prs.UseShellExecute = false;
pr.StartInfo = prs;
pr.Start();
Wenn ich nun versuche einen neuen Prozess zu starten dann bekomme ich entweder:
"The Process object must have the UseShellExecute property set to false in order to start a process as a user."
oder wenn ich UseShellExecute auf False setze:
"The requested operation requires elevation"
Weiss jemand, wie ich aus einer exe (wo der User keine Adminrechte hat) eine exe starten kann, die dann unter Adminrechten läuft.
Gruss Roger
Hallo an alle erst mal
Wiedermal habe ich ein Problem mit Vista.
Ich habe eine Application geschrieben, welche konfig files unter c:\Programme\Adobe ersetzen kann. (Über Sinn und unsinn solcher sachen möchte ich hier nicht diskutieren)
Da die User keine Admin rechte haben, habe ich vor der Kopier funktion ein Impersonate gemacht.
Dies funktioniert unter XP problemlos.
Damit die Applikation unter Vista beim Start nach mehr rechten fragt, habe ich auch ein manifest file gemacht.
Auch dies funktioniert.
Wenn ich dann unter Vista aber ein Impersonate mache, dann hat dieser User (obwohl Lokaler Admin ist) keine Admin rechte.
Wenn ich das Impersonate weglassen und der Lokale User hat Adminrechte, dann funktioniert das Tool problemlos.
Weiss jemand, wie ich Impersonate mit Adminrechten unter Vista bauen kann??
Bin für jeden Tipp dankbar.
Gruss Roger
Hallo herbivore
Vielen Dank für den Tipp.
Auf diese Idee wäre ich nie gekommen.
So bekomme ich die Infos.
Weisst du wesshalb man hier den StandartError nehmen muss?
Gruss Roger
Hallo an alle im Forum
Ich habe ein einfaches Form mit einem button und einer RichTextBox.
Ich versuche ein neuen Prozess zu starten und den StandartPutput zu redirecten.
Wenn ich folgenden Code ausführe funktioniert dies wunderbar.
Die RichTextbox wird mir gefüllt.
private void btnStart_Click(object sender, EventArgs e)
{
StringBuilder sbArguments = new StringBuilder();
Process pr = new Process();
ProcessStartInfo prs = new ProcessStartInfo();
prs.FileName = @"c:\Windows\System32\cmd.exe";
prs.RedirectStandardOutput = true;
prs.UseShellExecute = false;
prs.Arguments = @"/c dir d:\div";
pr.StartInfo = prs;
pr.Start();
StreamReader sr = pr.StandardOutput;
string sread = string.Empty;
while (!sr.EndOfStream)
{
sread = sr.ReadLine();
Debug.WriteLine(DateTime.Now + " " + sread);
rtbStatus.Text += sread + "\n";
sread = string.Empty;
rtbStatus.Invalidate();
}
pr.WaitForExit();
}
Nun möchte ich aber psexec.exe auf die gleiche Weise starten und auch den Output in die Richtextbox schreiben.
private void btnStart_Click(object sender, EventArgs e)
{
StringBuilder sbArguments = new StringBuilder();
Process pr = new Process();
ProcessStartInfo prs = new ProcessStartInfo();
prs.FileName = "psexec.exe";
prs.Arguments = @"\\anderercomputer -i -d -c c:\windows\notepad.exe";
prs.RedirectStandardOutput = true;
prs.UseShellExecute = false;
pr.StartInfo = prs;
pr.Start();
StreamReader sr = pr.StandardOutput;
string sread = string.Empty;
while (!sr.EndOfStream)
{
sread = sr.ReadLine();
Debug.WriteLine(DateTime.Now + " " + sread);
rtbStatus.Text += sread + "\n";
sread = string.Empty;
rtbStatus.Invalidate();
}
pr.WaitForExit();
}
Leider funktioniert dies nicht. ich bekomme überhaupt nichts zurück.
Dann habe ich gedacht, ich starte eine cmd box und dort drin die psexec.exe
private void btnStart_Click(object sender, EventArgs e)
{
StringBuilder sbArguments = new StringBuilder();
Process pr = new Process();
ProcessStartInfo prs = new ProcessStartInfo();
prs.FileName = @"c:\Windows\System32\cmd.exe";
prs.Arguments = (@"/c psexec.exe \\anderercomputer -i -d -c c:\windows\notepad.exe";
prs.RedirectStandardOutput = true;
prs.UseShellExecute = false;
pr.StartInfo = prs;
pr.Start();
StreamReader sr = pr.StandardOutput;
string sread = string.Empty;
while (!sr.EndOfStream)
{
sread = sr.ReadLine();
Debug.WriteLine(DateTime.Now + " " + sread);
rtbStatus.Text += sread + "\n";
sread = string.Empty;
rtbStatus.Invalidate();
}
pr.WaitForExit();
}
Leider bekomme ich auch so nicht den StandartOutput zurück.
Weiss jemand, wie ich den Output von psexec.exe umlenken kann?
Bin für jeden Tipp dankbar.
Gruss Roger
Hallo vollmond
welcher screensaver aktiv ist und wie lange es ght,bis er startet und ob danach ein passwort verlangt wird, steht alles in der registry.
Gruss Roger
Hallo rollerfreak2
Ich hatte vor kurzem das selbe problem.
Aber ich habe nicht nur dll's, sondern auch noch externe exe files.
Ich hab es so gelöst.
dll's und exe's als Resource in exe einbinden.
Dann beim Start die resourcen als dll und exe's speichern und benutzen.
Beim schliessen der Mainform lösche ich die dll's wieder.
Ich weiss nicht wie sinnvoll dieser ansatz ist, aber ich habe so nur noch 1 exe, welches meine Kollegen kopieren müssen.
Wenn ich es nicht so machen würde, müssen meine Kollegen, mindestens 4 Files kopieren.
Gruss Roger
Wir mussten bei uns die Security Zone im .NET Config anpassen.
Danach konnten wir problemlos .NET exe's vom Netzwerk starten.
Via cmd gehts auch, ist aber nicht so schön.
Ich habe folgendes verwendet.
[FONT]C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CasPol.exe -quiet -machine -addgroup All_Code -url \\* FullTrust -name "MeLuVaSFullTrust" -Zone Intranet -description "Diese Einstellung wird benötigt, um unter Framework 2.0 (oder höher) die Security-Einstellung so anzupassen, dass die Programme, die auf einem Server oder einem Netzlaufwerk liegen, von den Client gestartet werden können. Die Verteilung auf alle Clients geschieht mittels einem Weitergabepaket"
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Caspol.exe -quiet -machine -chggroup LocalIntranet_Zone FullTrust[/FONT]
Ich habe noch ein zip , wo alle files drin sind, damit man das ganze wieder via Gui machen kann, so wie in .NET 1.1
Kann das ganze leider nicht attachen, habe eine Fehlermeldung bekommen,
dass das zip file grösser als 256kb ist.
Wenn jemand die File will, einfach eine PM schreiben und ich schicke es.
Einfach entpacken und dann das bat file ausführen.
Gruss Roger
Hallo zusammen
Ich versuche gerade via AddPrinterConnection einen Netzwerkdrucker zu installieren.
Dies funktioniert auch ohne probleme.
Wenn ich in meiner Application ein Impersonate durchführe, dann sehe ich auch, dass der User gewechselt hat.
Nun funktioniert aber AddPrinterConnection nicht mehr.
Ich weiss, dass der Impersonate User genug rechte hat.
Weiss jemand, ob ich mit Impersonate auch Netzwerkdinge machen kann?
So wie eben Netzwerkdrucker installieren, oder auf Netzwerklaufwerke zugreifen?
Ich danke euch jetzt schon für eure Tipps.
Gruss Roger
Hallo
wieso liest du nicht die Printer der Printserver aus?
Ich mache es so, und bekomme genau das, was ich brauche.
Gruss Roger
Hallo FZelle
Wenn du ein neueres .NET Framework installiert hast und 1.1 auch noch installiert hast, dann muss du zum exe file eine config datei machen und dann läuft die Application wieder.
.NET Versucht jede .NET Application mit der neusten Version zu starten.
Da 1.1 und 2.0 nicht kompatibel sind, kommt es beim Programmstart zum absturz.
Du musst ein configfile machen, das genua den selben namen hat, wie die exe.
also test.exe dann heisst die config datei test.exe.config.
Da rein schreibst du
<configuration>
<startup>
<supportedRuntime version="v1.1.4322" />
</startup>
</configuration>
und danach sollte deine App wieder funktionieren.
Gruss Roger
Hallo Kovu
von winrar gibt es eine dos komponente.
Mit unrar.exe kannst du viel machen.
Ich entpacke so meine rar und zip files.
Die Prozentangabe kannst du aus dem stream saugen und anzeigen.
Michael A. McCloskey at ne schöne klasse für unrar.dll geschrieben.
Ich selbe benutze eher so was
Ich filtere mir die dinge raus, die ich nicht anzeigen will.
myStartInfo.FileName = sParExe;
myStartInfo.Arguments = "v \"" + s + "\"";
myStartInfo.RedirectStandardOutput = true;
myStartInfo.UseShellExecute = false;
myprocess.StartInfo = myStartInfo;
myprocess.Start();
StreamReader sr = myprocess.StandardOutput;
//Console.WriteLine(sr.ReadToEnd());
string sread;
brepair = false;
brepairpossible = true;
while (!sr.EndOfStream)
{
sread = sr.ReadLine();
if (sread != "par2cmdline version 0.2, Copyright (C) 2003 Peter Brian Clements." &&
sread != "par2cmdline comes with ABSOLUTELY NO WARRANTY." &&
sread != "This is free software, and you are welcome to redistribute it and/or modify" &&
sread != "it under the terms of the GNU General Public License as published by the" &&
sread != "Free Software Foundation; either version 2 of the License, or (at your" &&
sread != "option) any later version. See COPYING for details." &&
sread != "")
{
//Wenn es sich um ein par file handelt, dann in die liste eintragen, um es weiter zu verarbeiten
if (sread.StartsWith("Loading "))
{
slParFiles.Add(sread.Substring(9, sread.LastIndexOf("\"") - 9));
}
//Wenn es sich um ein zip oder rar file handelt, dann in die Liste eintragen, um es weiter zu verarbeiten
if (sread.StartsWith("Target: "))
{
slZipFiles.Add(sread.Substring(9, sread.LastIndexOf("\"") - 9));
}
if (sread == "Repair is required.")
{
brepair = true;
}
if (sread == "Repair is not possible.")
{
brepairpossible = false;
}
//Dies wird für die Ausgabe gebraucht, damit es schön aussieht
if (sread.EndsWith("%"))
{
Console.CursorLeft = 0;
Console.Write(string.Format("\t{0}", sread));
}
else
{
Console.CursorLeft = 0;
Console.WriteLine(string.Format("\t{0}", sread));
}
}
}
myprocess.WaitForExit();
Ist nicht sehr schön, aber bei mir funktioniert dies wunderbar.
Gruss Roger
Ich möchte mich bei allen, die den Thread gelesen habe entschuldigen.
Wenn ich geschaut hätte, was error 53 heisst, dann hätte ich gesehen.
Error 53 = ERROR_BAD_NETPATH
Dann wäre mir vielleicht auch aufgefallen, dass ich immer den Printernamen und nicht den Servernamen übergeben habe.
Der Code selber funktioniert ohne probleme.
Ich wünsche allen einen schönen Abend.
Gruss Roger
upps.....
das hab ich nicht nachgeschaut und das war ein grosser fehler!!!!
werd ich aber noch nachholen.
gruss roger
Hallo JAck30lena
Was ich versucht habe, steht ja im Sourcecode.
Sonst hätte ich den nicht angehängt.
Fehlermeldung hatte ich nach
iRet = WNetOpenEnum(
RESOURCE_SCOPE.RESOURCE_GLOBALNET,
RESOURCE_TYPE.RESOURCETYPE_ANY,
RESOURCE_USAGE.RESOURCEUSAGE_ALL,
nrr,
out ptrHandle);
und zwar ein code 53.
Ach ja, "\printservername" habe ich absichtlich hingeschrieben, denn ich will nicht servernamen von produktiven server ins forum stellen.
Wenn ich nicht weiterkomme, wieso kann ich (hab ja source) nicht fragen, ob dies schon jemand gemacht hat?
Soll man das Rad denn immer neu erfinden?
Es ist mir klar, dass ich bevor ich poste auch einiges an Zeit investiere und versuche das Problem zu lösen.
Wenn ich dann aber überhaupt nicht durchschaue mit den tips von pinvoke.net, dann frage ich einfach.
Ich habe auch eine fertige vb6 lösung, kann die aber nicht in c# umsetzen.
Gruss Roger
Hallo an alle
Ich versuche alle Printer eines Printservers auszulesen.
Habe mit mpr.dll probiert, aber irgendwie krieg ich keine Printer aufgelistet.
Habe mit fogendem Code probiert.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace PrinterEnum
{
class Program
{
static void Main(string[] args)
{
WNETOE(null);
Console.WriteLine("\n\nFertig");
Console.ReadKey();
}
[DllImport("mpr.dll", CharSet = CharSet.Auto)]
public static extern int WNetEnumResource(
IntPtr hEnum,
ref int lpcCount,
IntPtr lpBuffer,
ref int lpBufferSize);
[DllImport("mpr.dll", CharSet = CharSet.Auto)]
public static extern int WNetOpenEnum(
RESOURCE_SCOPE dwScope,
RESOURCE_TYPE dwType,
RESOURCE_USAGE dwUsage,
[MarshalAs(UnmanagedType.AsAny)][In] Object lpNetResource,
out IntPtr lphEnum);
[DllImport("mpr.dll", CharSet = CharSet.Auto)]
public static extern int WNetCloseEnum(IntPtr hEnum);
//declare the structures to hold info
public enum RESOURCE_SCOPE
{
RESOURCE_CONNECTED = 0x00000001,
RESOURCE_GLOBALNET = 0x00000002,
RESOURCE_REMEMBERED = 0x00000003,
RESOURCE_RECENT = 0x00000004,
RESOURCE_CONTEXT = 0x00000005
}
public enum RESOURCE_TYPE
{
RESOURCETYPE_ANY = 0x00000000,
RESOURCETYPE_DISK = 0x00000001,
RESOURCETYPE_PRINT = 0x00000002,
RESOURCETYPE_RESERVED = 0x00000008,
}
public enum RESOURCE_USAGE
{
RESOURCEUSAGE_CONNECTABLE = 0x00000001,
RESOURCEUSAGE_CONTAINER = 0x00000002,
RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004,
RESOURCEUSAGE_SIBLING = 0x00000008,
RESOURCEUSAGE_ATTACHED = 0x00000010,
RESOURCEUSAGE_ALL = (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED),
}
public enum RESOURCE_DISPLAYTYPE
{
RESOURCEDISPLAYTYPE_GENERIC = 0x00000000,
RESOURCEDISPLAYTYPE_DOMAIN = 0x00000001,
RESOURCEDISPLAYTYPE_SERVER = 0x00000002,
RESOURCEDISPLAYTYPE_SHARE = 0x00000003,
RESOURCEDISPLAYTYPE_FILE = 0x00000004,
RESOURCEDISPLAYTYPE_GROUP = 0x00000005,
RESOURCEDISPLAYTYPE_NETWORK = 0x00000006,
RESOURCEDISPLAYTYPE_ROOT = 0x00000007,
RESOURCEDISPLAYTYPE_SHAREADMIN = 0x00000008,
RESOURCEDISPLAYTYPE_DIRECTORY = 0x00000009,
RESOURCEDISPLAYTYPE_TREE = 0x0000000A,
RESOURCEDISPLAYTYPE_NDSCONTAINER = 0x0000000B
}
public struct NETRESOURCE
{
public RESOURCE_SCOPE dwScope;
public RESOURCE_TYPE dwType;
public RESOURCE_DISPLAYTYPE dwDisplayType;
public RESOURCE_USAGE dwUsage;
[MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)]
public string lpLocalName;
[MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)]
public string lpRemoteName;
[MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)]
public string lpComment;
[MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)]
public string lpProvider;
}
//the function we'll be calling
public static void WNETOE(Object o)
{
NETRESOURCE nrr = new NETRESOURCE();
nrr.lpRemoteName = @"\\printservername";
nrr.dwUsage = RESOURCE_USAGE.RESOURCEUSAGE_CONTAINER;
int iRet;
IntPtr ptrHandle = new IntPtr();
try
{
iRet = WNetOpenEnum(
RESOURCE_SCOPE.RESOURCE_GLOBALNET,
RESOURCE_TYPE.RESOURCETYPE_ANY,
RESOURCE_USAGE.RESOURCEUSAGE_ALL,
nrr,
out ptrHandle);
if (iRet != 0)
{
return;
}
int entries;
int buffer = 16384;
IntPtr ptrBuffer = Marshal.AllocHGlobal(buffer);
NETRESOURCE nr;
for (; ; )
{
entries = -1;
buffer = 16384;
iRet = WNetEnumResource(ptrHandle, ref entries, ptrBuffer, ref buffer);
if ((iRet != 0) || (entries < 1))
{
break;
}
Int32 ptr = ptrBuffer.ToInt32();
for (int i = 0; i < entries; i++)
{
nr = (NETRESOURCE)Marshal.PtrToStructure(new IntPtr(ptr), typeof(NETRESOURCE));
if (RESOURCE_USAGE.RESOURCEUSAGE_CONTAINER == (nr.dwUsage
& RESOURCE_USAGE.RESOURCEUSAGE_CONTAINER))
{
//call recursively to get all entries in a container
WNETOE(nr);
}
ptr += Marshal.SizeOf(nr);
Console.WriteLine(" {0} : LocalName='{1}' RemoteName='{2}'",
nr.dwDisplayType.ToString(), nr.lpLocalName, nr.lpRemoteName);
}
}
Marshal.FreeHGlobal(ptrBuffer);
iRet = WNetCloseEnum(ptrHandle);
}
catch (Exception e)
{
}
}
//here's some possible error codes
public enum NERR
{
NERR_Success = 0,/* Success */
ERROR_MORE_DATA = 234, // dderror
ERROR_NO_BROWSER_SERVERS_FOUND = 6118,
ERROR_INVALID_LEVEL = 124,
ERROR_ACCESS_DENIED = 5,
ERROR_INVALID_PARAMETER = 87,
ERROR_NOT_ENOUGH_MEMORY = 8,
ERROR_NETWORK_BUSY = 54,
ERROR_BAD_NETPATH = 53,
ERROR_NO_NETWORK = 1222,
ERROR_INVALID_HANDLE_STATE = 1609,
ERROR_EXTENDED_ERROR = 1208
}
}
}
Leider habe ich absolut kein Erfolg.
Hat per zufall jemand ein Source, mit Printer auslesen und ev auch eine automatische Printerinstallation?
Danke für eure Infos.
Gruss Roger
Hi Big Al
erst mal: Cooles tool
Mich würde es freuen, wenn du den Source rausgeben würdest, denn ich denke man kann sich ein paar dinge abgucken.
z.B. das control, wo du alles draufzeichnest.
Gruss Roger
Hallo billGates
Bau dir doch ein Usercontrol mit treeview und listview.
Ist nicht sehr viel arbeit.
Gruss Roger
Hi Jack30lena
Danke für den hinweis
Werds probieren.
was ich aber noch nicht verstehe:
Wenn ich eine List<WriteText> nehmen, dann kann ich ja nur WriteText da einfügen.
Ich will aber verschiedene klassen in eine Collection einfügen.
Gruss Roger
Hallo David
Mein Problem sind nicht Eigenschaften oder so was.
Usercontrols zu bauen sind auch nicht mein Problem.
Ich will aber in einem Usercontrols Items in eine Collection hinzufügen können und weiss nicht, wie ich diesn Teil machen muss.
Das Problem ist, dass die Items ais anderen Klassen kommen.
Wenn ich ein Properties baue z.B.
public Color myColor
{}
Dann ist ja klar, dass ich im Designer ein Color element zur Auswahl habe.
Was muss ich aber genau machen, wenn ich nicht Color, sondern eben verschiedne Klassen hinzufügen will.
Gruss Roger
Hallo an alle
Ich will mir ein Usercontrol bauen, in dem ich verschiedene Items in eine Collection nehmen kann.
Die Items kommen aus klassen.
also z.B.
class WriteText
{
//Diese klasse schreibt ein text an eine bestimmte stelle
}
class WriteBoldText
{
//Diese klasse schreibt ein fetten text an eine bestimmte stelle
}
nun sollen auf meinem Usercontrol die beiden klassen mehrfach eingefügt werden können.
So wie im toolstrip die Verschiedenen Items eingefügt werden können.
Leider weiss ich momentan überhaupt nicht, wie ich beginnen muss.
Ich hoffe es hat mir jemand einen Tipp.
Gruss Roger
Hallo Spysie
Ich hatte das selbe Problem.
Die lösung ist ganz einfach!!
Such dir die Files wo so was drin steht.
<Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\v2.0\Microsoft.Xna.GameStudio.Common.targets" />
Dann änderst du das auf:
<Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\v3.0\Microsoft.Xna.GameStudio.Common.targets" />
und dann suchst du noch
<Reference Include="Microsoft.Xna.Framework, Version=2.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d, processorArchitecture=x86" />
und änderst dies auf
<Reference Include="Microsoft.Xna.Framework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d, processorArchitecture=x86" />
dateien speicher und in VS08 öffnen.
Bei mir hat dies wunderbar funktioniert.
Gruss Roger
hi th69
merci für die infos
werds probieren
Gruss Roger
Kennt wirklich niemand einen Workaround????
Hallo Leute
Ich habe ein Contextenu.
Solange ich die ForeColor und BackColor nicht ändere sieht es schön aus.
Sobakkd ich aber ForeColor, oder BackColor ändere, dann habe ich die Farbliche trennung von Icon und Text nicht mehr.
Weiss einer, wie man den farblichen Unterschied wieder hinbekommt???
So wie bei About und Edit.
Gruss Roger
ich glaube, du kannst die Rotate Transform reseten und dann wieder normal zeichnen.