Hi,
um euch auf den neusten Stand zu halten 😄. Ich hab angefangen jetzt TAPI3 zu wrappen mit c++/cli, weil ich mir gedacht habe wenn ich da nicht weiterkomme kann ich mich ja ein bisschen in c++/cli einlesen. Derzeit bin ich mit meinem TAPI3 Wrapper weiter, wie mit der alten Methode über pinvoke und TAPI2.
lg
Hi,
@Ronny, ich kenn den Wrapper von Julmar, ich würde aber gerne selber so einen wrapper schreiben.
Ich habe soviel rausgefunden:
Da Tapi3 ein COM-Interface ist und zwar ein ziemlich kompliziertes funktioniert es nur Teilweise in einfacher form mit dem "automatischen COM-Wrapper" vom Visual Studio.
Wann man im Visual Studio ein COM-Interface als Verweis benutzt wird es mit einem "automatischen Wrapper" zugänglich gemacht. Da es bei COM normal ist dass man seine erstellten Objekte auch selber wieder frei gibt und beim c# nicht ( da übernimmt dass der Garbagecollector ) kann es vorkommen dass Objekte länger nicht fregegeben werden als sie eigentlich gebraucht werden. Tapi ist so aufgebaut dass Teilweise sachen nicht nochmal Funktionieren solange das "alte" nicht vorbei ist und so kann es z.B. zu verschluckten Events kommen usw. ( Wenn ich bei dem oberen Text falsch liege bitte berichtigt mich )
Ich hab mir deswegen gedacht, dass ich erst mal mit tapi2 anfange und das wrappen über den pinvoke der tapi32.dll. Ich hab es auch schon geschaft tapi zu initialisieren freu 😄!
Jetzt hab ich aber ein neues Problem und zwar mit der funktion linegetdevcaps.
Diese funktion muss man zweimal aufrufen, einmal um den platzbedarf der zu übergebenden Struktur zu bekommen und einmal um die vollständigen Infos zu dem Device zu bekommen.
Hier mal der Codeausschnitt wie es in C gemacht wird
...
LINEDEVCAPS LineDevCaps;
LineDevCaps.dwTotalSize = sizeof(LineDevCaps);
if(0 == lineGetDevCaps(hLineApp, dwCurrentDevID,
dwAPIVersion, 0, &LineDevCaps))
{
BYTE* pLineDevCapsBytes = new BYTE[LineDevCaps.dwNeededSize];
if(0 != pLineDevCapsBytes)
{
LINEDEVCAPS* pLineDevCaps = (LINEDEVCAPS*)pLineDevCapsBytes;
pLineDevCaps->dwTotalSize = LineDevCaps.dwNeededSize;
if(0 == lineGetDevCaps(hLineApp, dwCurrentDevID,
dwAPIVersion, 0, pLineDevCaps))
{
...
wie macht man das in c#? ich kann kein byte-array zu einer Structur casten schon gar nicht wenn die structur am Ende größer sein soll wie sie eigentlich ist.
Danke für eure hilfe 😉
lg
Ich schau bei so sachen immer gerne unter pinvoke.net nach:
ShowWindow
Da steht das Enum dabei
lg
Hey Leute,
ich versuch gerade ein Programm zu schreiben, dass mir bei einem Anruf die Nummer des Anrufers anzeigt. Ich hab das ganze schon versucht mit der tapi3.dll über verweise einbinden und dan ( managed ) auf die tapi zu zu greiffen. Das funktionierte nicht so ganz mit den events, sie wurden nur beim ersten Anruf geschmissen ... naja ! Ich fand dann auch diesen Artikel von Microsoft:
http://support.microsoft.com/default.aspx?scid=kb;en-us;841712
Da steht drinnen dass das gar nicht geht was ich vor hatte. So und jetzt zu meiner Frage gg
Wenn da jetzt steht ich soll da unmanaged drauf zugreiffen heist das ich muss die tapi3.dll mit pinvoke benutzen oder muss ich direkt in c++ eine dll schreiben die da drauf zugreift ?
liebe Grüße
Hi Leute,
geht das, dass ich ein Objekt im Speicher ersetzte, also dass alle Referenzen die vorher auf das alte Objekt referenziert haben auf das neue object referenzieren ?
Also ich muss ein Objekt durch ein anderes Ersetzen, weil eine Typumwandlung geschieht aber das neue Object ist von dem alten abgeleitet.
Danke für eure Hilfe.
Christian
Da es mit der Software von Digital-Persona funktioniert hab mal ein paar sachen versucht:
Ich hab rausgefunden , dass die Software von DigitalPersona die dpDevCtl.dll anspricht wenn man seinen Finger auf das gerät liegt.
In der Dll dpDevCtl.dll sind folgende Funktionen:
FD_CloseDevice
FD_CloseDeviceManager
FD_DllGetVersion
FD_Entry
FD_EnumerateDevice
FD_GetDataFormat
FD_GetDeviceInfo
FD_GetParameter
FD_OpenDevice
FD_OpenDeviceManager
FD_SetParameter
FD_TestDevice
jetzt weis ich nur noch nicht wie die Struktur der Funktionen aussieht, also welchen rückgabewert sie haben und welche Parameter sie benötigen.
Weis einer wie ich das rausfinde, da die Namen der Funtkionen sehr vielversprechend sind meiner Meinung nach
lG
Ich habs jetzt ein bisschen probiert und es ist gar nicht einfach, selbst mit der testapplikation von grfinger erkennt er meinen microsoft fingerprint reader nicht. Da rührt sich nix
lG
Irgendwas ist an dem ding brutal komisch !!
weis einer einen anderen Fingerprint-Reader, der leicht und köstengünstig zu programmieren ist ?
Also kostenloses SDK oder eine gute Doku zum hernehmen von dlls oder irgendwie so
lG
Hier gibts eine SDK für den Reader
http://www.griaule.com/page/de/downloads
aber bei mir wird der Reader nicht mal im Geräte-Manager erkannt wenn die mitgelieferte Software nicht installiert ist
Hmm joa, ich glaub man kanns dem Angreifer eig. nur versuch brutal schwer zu machen .Sobald irgendwas wieder entschlüsselt werden soll, ist auch irgendwo eine Angriffsmöglichkeit.
Hi,
Ahso gg jetzt hats klick gemacht.
Man kann wenigstens nicht einfach den Key irgendwo hinkopieren und das von dir dafür vorgesehene Programm zum entschlüsseln verwenden, da dies ja immer in die Seriennummer benutzt. Wie sieht es dann mit einer Mischung aus Hardwareseriennummer ( kann man die ProzessorID fälschen ?) und fest einprogrammiertem Key ( evtl initVector bei Rijndael ) aus ?
lg
Hi herbivore,
ich dachte die Seriennummer ist nicht so einfach fälschbar oder?
lg
Hi herbivore,
stimmt einerseits schon, aber wenn er Passwörter sicher abspeichern will , damit er diese irgendwo nicht immer eingeben muss finde ich das schon gut. Wenn die Festplatte ausfällt muss er die Passwörter halt nochmal neu eingeben
lG
Ich hab genau das selbe Problem.
Mein Ansatz wäre, dass der Schlüssel mit dem die Sachen ver und entschlüsselt wird aus den Hardwarekomponenten generiert werden, müsste ziemlich eindeutig sein.
So wird entsteht auf einem anderen PC ein anderer Schlüßel mit dem versucht wird die Daten zu entschlüsseln und du könntest die Verschlüsselten Daten nur mit dem PC wieder entschlüsseln, mit dem du sie verschlüsselt hast.
Edit : ich hab jetzt ein Bisschen nachgelesen , die Seriennummer der HDD sollte eindeutig sein oder ?
Ahh ok äm sorry 😁
Erst mal der TypeConverter
public class DatumTypeConverter : TypeConverter {
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) {
if (sourceType == typeof(string))
return true;
return false;
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) {
if (value is String) {
string[] Teile = ((string)value).Split('.');
int Jahr = DateTime.MinValue.Year;
int Monat = DateTime.MinValue.Month;
int Tag = DateTime.MinValue.Day;
if (Teile.Length >= 3)
if (!int.TryParse(Teile[2], out Jahr))
Jahr = DateTime.MinValue.Year;
if (Teile.Length >= 2)
if (!int.TryParse(Teile[1], out Monat))
Monat = DateTime.MinValue.Month;
if (Teile.Length >= 1)
if (!int.TryParse(Teile[0], out Tag))
Tag = DateTime.MinValue.Day;
return new Datum(Jahr, Monat, Tag);
}
return null;
}
}
die Verbindung von Converter und Objekt geht dann über ein Attribut
[TypeConverter(typeof(DatumTypeConverter))]
class Datum : IComparable<Datum> {
....
}
Das wars und schon kann ich im DataGridView mein eigenens Objekt editieren
lG
Ich habs geschafft, man muss einfach einen TypoConverter schreiben, der das Umwandeln von einem String in dein eigenes Objekt behandelt
PS: ich finde schon dass das ein Argument ist weil die .net Framework Klassen auch nicht mehr oder weniger Möglichkeiten haben wie ich
Joa ich weis aber irgendwas muss es da geben, DateTimes z.B. können auch so bearbeitet werden
Ich weis ja nicht ob das Problem noch aktuell ist aber:
EventHandler auf CellMouseDown
private void DataGrid_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) {
DataGrid.ClearSelection();
if (e.Button == MouseButtons.Right) {
DataGrid.Rows[e.RowIndex].Selected = true;
}
}
lg
Hi Leute,
ich hab ein eigenes Datum-Objekt geschrieben, welches in einem anderen Objekt als Property ist. Jetzt hab ich einem DataGridView als DataSource eine Liste aus den Objekten gegeben ( die das Datum-Objekt als Property haben ). Mein Problem ist dass ich es nicht verändern kann, weil vermutlich das DataGridView nicht weis wie es den String in mein Datum-Objekt umwandeln soll.
vielen Danke für eure Hilfe
lG
lol stimmt da bin ich wohl aufn hirrn gesessen 🤔 ... , naja
dankeschön
Hi,
erst einmal ein beispiel
Zeitbereich1:
DateTime1 = 26.01.2007 19:00
DateTime1 = 26.01.2007 1:00
Zeitberech2:
DateTime1 = 26.01.2007 20:00
DateTime1 = 26.01.2007 6:00
i würde jetzt gerne wissen wievel Zeit beide gleich haben, also im Beispiel wären dass 5 Stunden.
Gibts das schon Methoden im Framework oder wie kann ich das berechnen ?
Lg
ok dann werd ich ihm diese zwei möglichkeiten anbieten.
Danke herbivor für deine Hilfe
Lg
gute frage 😁
ich wollte dem benutzer die Einstellmöglichkeit lassen ob die Statusform TopMost oder nur für die Anwendung ganz vorne angezeigt werden soll
Achso 😁
Die Form die immer im Vordergrund sein soll, ist eine Statusform die immer den aktuellen Status von etwas anzeigt, und dass würde ich gerne im Vordergrund haben dass die "normale" Form mit der man arbeitet diese Statusform nicht überdeckt.
Hi,
eig. will ich erreichen dass eine Form nicht TopMost aber immer vor einer anderen FORM ist
lG
Hi
ich will ein Fenster haben, dass immer vor einer MDI-Form ist also hab ich mir gedacht das geht ganz einfach
Form.show(mdiForm);
aber dann wird die Form immer minimiert wenn die MDI-Form minimiert wird, kann man das verbieten ?
danke für eure Hilfe
lG
Hi herbivore,
Entschuldigung ich war Fest der Meinung, dass das Zuweisen selbst das Problem ist. Doch es war durch eine im set bereich der Property- Aufgerufener Event der noch einen Event Aufreif und der wollte den string bearbeiten, welcher ja dann null war.
Sorry nochmal und vielen Dank
lG
Hi herbivore
Die zwei Anweisungen hab ich direkt hintereinander stehen und erst bei der zweiten Anweisung kommt die Exception.
Object.GetType().GetProperty("Kommentar").SetValue(Object, "", null); //Keine Exeption
Object.GetType().GetProperty("Kommentar").SetValue(Object, null, null); //NullReferenceException
Hi herbivore,
ich hab mir die FAQ schon durchgelesen, aber es ist kein Objekt null. Der wert den ich mit SetValue setzen will ist null ( 2.Parameter ), das ist mein Problem und der soll ja auch null sein weil ( wie im oberen Beispiel ) Kommentar auch null sein soll
Hi herbivore,
aber das Funktioniert ja
string tst = "";
tst = null;
wenn man dann im Debugger in das Objekt reinschaut ist der string null, deswegen versteh ich das nicht.
und mein Test-Code wo z.B. diese Exception kommt lautet :
Object.GetType().GetProperty("Kommentar").SetValue(Object, null, null);
wobei Kommentar eine string-Property ist
lG Christian
Hi,
ich hab folgendes Problem :
Ich will einen string über Reflection auf null setzten, normalerweise kann man ja einem string , null zuweisen, nur bei der Reflection bekomme ich immer eine TargetInvocationException mit einer InnerException : NullRefernceException.
Danke für euere Hilfe
lG
Christian
Hi,
ich habe bei einem Programm von mir einen Systemhook integriert über den ich Tasten abfangen kann , das geht ja auch ...
Nur will ich jetzt auch noch den Text der gedrückten Taste anzeigen lassen (quasi "return" oder "shift")
Ich hab gelesen dass das mit der Api GetKeyNameText geht ... ich schaffs aber einfach nicht
Vom System Hook kommt ein IntPtr mit dem lParam :
private IntPtr HookCallBack(int nCode, IntPtr wParam, IntPtr lParam)
der wird dann in eine KeyboardHookStruct umgewandelt
KeyInfo = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
und dann wollt ich mit diesem Aufruf den Namen herrausfinden
StringBuilder sb = new StringBuilder(256);
uint key = (uint)KeyInfo.vkCode << 16;
GetKeyNameText(key, sb, 256);
Die Structur schaut so aus :
public struct KeyboardHookStruct {
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
und der P/Invoke so :
[DllImport("user32.dll")]
static extern int GetKeyNameText(uint lParam, [Out] StringBuilder lpString, int nSize);
kann mir bitte einer helfen , ich bin total verzweifelt 😉
lg und Danke
Sirox
Hi , ich war an dem gleichen Problem ich hätte da nur eine Andere Lösungsart ( ich hab aber von oben gespickt 😁 ) aber die PInvokes haben mir nicht so gefallen also :
Excel.Application xlApp = new Excel.Application();
xlApp.Caption = xlGuid;
//In meinem Programm ist es so dass man das Fenster nicht sehn muss
xlApp.Visible = false;
//Workbook und Worksheet öffnen und sachen damit machen
//Hier muss das Fenster geöffnet werden sonst kann man es nicht Identifizieren, aber hald nur Minimiert so merkt nicht ( bzw. kaum )
xlApp.WindowState = Excel.XlWindowState.xlMinimized;
xlApp.Visible = true;
foreach (System.Diagnostics.Process procI in System.Diagnostics.Process.GetProcessesByName("EXCEL")){
if (procI.MainWindowTitle.IndexOf(xlGuid) != -1) {
procI.CloseMainWindow();
procI.Refresh();
procI.Kill();
}
}
So spart man sich den PInvoke
lG
Sirox
Verstehe ich das richtig ? Du willst nur verschieden Positionen speichern können ?
Ich würde das so machen:
Ein enum erstellen welches die verschiedenen Varianten beschreibt
public enum FensterAnsichten {
Standart,
Erweitert
}
Dann in deiner Form als Member
Dictionary<FensterAnsichten , Point> Ansichten = new Dictionary<int, Point>();
Hinzufügen geht dann mit
Ansichten.Add(FensterAnsichten.Standart,new Point(this.Left,this.Top));
Abrufen geht mit
this.Left = Ansichten[FensterAnsichten.Standart].X;
this.Top = Ansichten[FensterAnsichten.Standart].Y;
lG Sirox
PS: könnten kleine Fehler drinnen sein hab es jetzt einfach mal so hingeschrieben
kann mir keiner Helfen ? ich hab den fehler immer noch und ich glaub dass, der Fehler in meinem Code ist! Ich vermute visual c# stürzt ab weil der designer beim erstellen der Instanze der Form eine Exception bekommt.
Das Programm läuft aber ohne Probleme
Ich hab jetzt ein bischen rumprobiert und mit folgender Version geht es , frag mich nicht warum
private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e) {
if (e.Node.Bounds == Rectangle.Empty)
return;
Brush brshBackGround = null;
Font fntNode = null;
//Hintergrundfarbe festlegen
if ((e.State & TreeNodeStates.Selected) == TreeNodeStates.Selected)
brshBackGround = Brushes.DarkBlue;
else
brshBackGround = Brushes.White;
//Schriftart festlegen
fntNode = e.Node.NodeFont;
if (fntNode == null)
fntNode = ((TreeView)sender).Font;
//Hintergrund zeichnen
e.Graphics.FillRectangle(brshBackGround, e.Node.Bounds);
//Text zeichnen
e.Graphics.DrawString(e.Node.Text, fntNode, Brushes.Black, e.Node.Bounds);
e.DrawDefault = false;
}
Hi,
ich versuche den Text von einem TreeView selbst zu zeichnen mit folgendem Code:
private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e) {
Brush brshBackGround = null;
Font fntNode = null;
//Hintergrundfarbe festlegen
if ((e.State & TreeNodeStates.Selected) == TreeNodeStates.Selected)
brshBackGround = Brushes.DarkBlue;
else
brshBackGround = Brushes.White;
//Schriftart festlegen
fntNode = e.Node.NodeFont;
if (fntNode == null)
fntNode = ((TreeView)sender).Font;
//Hintergrund zeichnen
e.Graphics.FillRectangle(brshBackGround, e.Bounds);
//Text zeichnen
e.Graphics.DrawString(e.Node.Text, fntNode, Brushes.Black, e.Bounds);
}
aber irgendwie sieht das nicht sauber aus! Beim erstenmal öffnen werden alle Items ganz oben links hin gezeichnet und wenn ich durch die Items klicke dann sind überall so komische ränder zu sehen. Was mache ich falsch ?
Hi, versuchs mal mit der Veröffentlichen-Funktion von Visaul Studio
Erstellen -> programm Veröffentlichen und durchklicken
lG
Also ich habs mal kurz Ausprobiert und das was mich abgebracht hat SharpDevelop zu benutzen, ist dass man den Inhalt der Objekte im Debugging-Modus nicht so schön anschaun kann wie in Visual C#. Kann aber auch sein dass es irgendwie geht ich habs echt nur ganz kurz angesehen!
Dann ist die Programmieren mit dem .net compact framework aufwendig zum laufen zu bringen, näher hab ich mir die IDE auch nicht angesehen sorry!
lG
Ja es gibt eine Alternative, sie heist SharpDevelop und ist sogar OpenSource kann leider nur nicht so viel wie VS
http://www.icsharpcode.net/OpenSource/SD/
lg Sirox
Hi leute,
ich wenn an meinem Projekt arbeite, dann stürzt mir immer wieder mein Visual C# ab, aber ich weis nicht warum.
Visaul C# fordert dann auf den Fehlerbericht zu Microsoft zu senden und da steht volgendes drin:
EventType : clr20r3 P1 : vcsexpress.exe P2 : 8.0.50727.762
P3 : 457150e1 P4 : ws1components P5 : 1.0.0.0 P6 : 45e2daf5
P7 : 644 P8 : 576 P9 : system.exception
Was bedeutet das ganze ? Wie kann ich aus sowas schlau werden ?
lG Sirox
Ich kann nichts auffälliges finden... ihr ? Wenn man den Timer in die Form zieht wird der konstruktor in der InizializeComponet() mit einem Parameter aufgerufen... wie schafft man sowas ?
Wo kann ich mir den Quelltext von z.B. vom Timer ansehen ?
Jetzt hab ich versucht das Objekt nicht über die Methode InitializeComponent() zu Erzeugen sondern direkt im Konstruktor ( da hat ja dann der Designer keinen einfluss ) aber Anzeigen tut er mein Control dafür leider auch nicht
Das ist eine Referenz auf ein anderes Control, mit dieses Control zusammenspielt, nein ich brauch den Wert definitiv im Konstruktor und da muss es auch irgendwas geben. Bei den eingebetteten Controls von M$ gibts auch einige, die im designer mit einem Parameter aufgerufen werden!
Irgendwas muss es da geben, ich hab mir die .Designer.cs angesehen , da gibts bereits Controls die von Hausaus mit einem Parameter gestartet werden ( z.B. System.ComponentModel.ComponentResourceManager ) aber wenn ich den Konstruktor mit Parameter da händisch eingebe, dann ist da nach der nächsten Änderung im Designer wieder der Konstruktor ohne Parameter drinnen
Das Problem ist ich brauch den Wert umbedingt im Konstruktor
aber am allercoolsten wäre wenn mir einer sagen würde ob/wie man einem Designer kann welchen Wert er für den Parameter mitgeben soll
COOOL danke danke , muss ich gleich ausprobieren!
schade, naja ok ... danke für die Hilfe!