Direkte Ausgabe auf den Desktop (GDI+)
-
Weiss da jemand etwas? Zusätzlich würde es mich interessieren, ob es möglich ist die Mausposition auf dem Desktop herauszufinden, wenn mein Programm im Hintergrund läuft?
mfg phili_wendt
-
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Runtime.InteropServices; namespace Own { class User32 { [DllImport("User32.dll")]public extern static System.IntPtr GetDC(System.IntPtr hWnd); [DllImport("user32")]public static extern int GetCursorPos(ref Point lpPoint) ; public static Graphics GetDestopGraphics () { return System.Drawing.Graphics.FromHdc(User32.GetDC(System.IntPtr.Zero)); } public static Point GetCursorPos() { Point p=new Point(); p.X=0; p.Y=0; GetCursorPos(ref p); return p; } } }
naja, das mit dem Desktop ist so eine Sache. Er zeichnet immer in den Vordergrund. Außerdem hat man so natürlich kein Einfluss auf das Neuzeichnen der erzeugten Grafiken. Das könnte man lösen, indem man sich mit hooking ins System einhängt und das Neuzeichnen des Desktops abfängt. Dort bekommt man sicher auch den Umstand in den Griff, dass immer im Vordergrund gezeichnet wird. Prinzipiell ist .NET für so etwas aber nicht ausgelegt.
-
Hi, auch mit dem Code gehts nicht...
#include <iostream> #using <mscorlib.dll> #using <system.dll> #using <system.drawing.dll> #using <system.windows.forms.dll> HWND__ __nogc *GetConsoleWindow() { HWND__ __nogc *hwnd; char strNewTitle __nogc[256]; char strOldTitle __nogc[256]; GetConsoleTitle(strOldTitle, 256); wsprintf(strNewTitle, "%d/%d", GetTickCount(), GetCurrentProcessId()); SetConsoleTitle(strNewTitle); Sleep(50); hwnd = FindWindow(0, strNewTitle); SetConsoleTitle(strOldTitle); return hwnd; } System::Void Visible(System::Boolean Value) { if (Value) ShowWindow(GetConsoleWindow(), SW_SHOW); else ShowWindow(GetConsoleWindow(), SW_HIDE); } __int32 main() { System::Drawing::Graphics __gc *Surface; HWND__ __nogc *Handle = GetDesktopWindow(); Surface = System::Drawing::Graphics::FromHdc(*__nogc new System::IntPtr((void __nogc*)GetDC(Handle))); Visible(false); { // usw... } Visible(true); if (Surface) Surface->Dispose(); }
edit: Oy, du arbeitest ja mit C#
mfg BlueShift
-
Danke, werd ich mal probieren.
@blueshift: ich code mit c++, hab bloss diesen Bereich gewählt, weil GDI+ eine neuerung von .NET ist.
-
bitte demnächst die Sprache mit angeben, damit man nicht umsonst nach lösungen sucht, bzw gleich in der richtigen Sprache anbieten kann.
-
Gut, die Mausposition und das zeichnen auf den Desktop geht jetzt, danke.
Geht es auch die (maus)Tasten abzufragen, ohne einen Keylogger/Hook zu basteln?
-
ich glaub ohne Hooking siehts schlecht aus.
schreib ne unsave-dll in c++ und kapsel das hooking. versuch diese dll so einzubinden wie beschrieben.
vielleicht solltest du aber generell diesen Part deines Programms in unmanaged c++ schreiben und extern einbinden.
-
Die anderen beiden Funktionen(GetDC(), GetCursorPs()) hab ich bereits schon in eine Lib reincompiliert und eingebunden, so funktioniert weiterhin die MessageBox unter .NET.
Für den Hook ist es kein Problem einen zu coden, das Problem ist nur, den vernüntig einzubauen. Komm ich beim Framework irgendwie an die MessageCallback ran? Hab in der MSDN Doku was von der Funktion "CommonDialog.HookProc" gelesen, das funzt bei mir aber nicht. Hat jemand damit schon erfahrungen?mfg rednose
-
naja, ich hab das irgendwann schon mal gemacht. *rolleyes*
hilft da sicherlich weiter
und
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks.asp
ist ein Brauchbares aber recht unfangreiches Beispiel. Es reicht ja ,wenn du dich auf die Mouse konzentrierst.
-
das ist gut, leider aber bloss winapi. gibt es in derwinapi eine chance auf anwendung von diensten, unter .net wird das wohl nix mehr?
mfg rednose
-
WinApi, richtig. Ohne dem siehts schlecht aus.
.NET ist für sowas nicht konzipiert.
-
AndreasW schrieb:
WinApi, richtig. Ohne dem siehts schlecht aus.
.NET ist für sowas nicht konzipiert.Richtig.
Was mich stutzig macht, ist es, dass WinApi nach einigen Berichten bei künftigen Windows Versionen komplett durch .NET ersetzt werden soll. Da muss .NET aber mächtig an Funktionalität zulegen.
-
Ich schätze, das MS die Entwickler nicht mehr im System haben wollen. Zumal man dort ja auch recht gut Schaden durch Inkompetenz anrichten kann.
Würde mich nicht wundern, wenn MS da prinzipiell ein Riegel vor schiebt. Bedeutet aber, dass die gewohnte 'Programmiermacht' ziemlich zusammengestutzt wird.
Eines ist sicher, da wird sich noch einiges an der MS-Front zusammenbrauen und einige werden wieder nach unmanaged C++ umsteigen.
Ich bezweifele mal, dass MS alles (auch das BS) auf .NET umstellt. Viel mehr glaube ich dass unmanaged c++ gepaart mit managed Code in Teilbereiche das rennen machen wird. So wurde es auch in ähnlicher wiese auf dem Kongress in Kassel von MS kommuniziert. Allerdings sind die dort aber verständlicher weise nicht näher drauf eingegangen.
Wenn dem so ist, wäre es doch Klasse, wenn diese neue Libary verfügbar wäre. Durch eine solche Libary würde unmanaged C++ wieder an Bedeutung gewinnen, zumal sich auf anderen Plattform C++ ja auch mehr oder weniger durchgesetzt hat. Vielleicht hat MS deshalb das Studio in Sachen C++ nicht aufgefrischt und wartet ab, bis die Libary fertig ist. Aber dass sind ja nur Spekulationen...
-
Nur falls es jemanden interessiert, ha ich grad auf einem anderem forum empfohlen bekommen: http://www.thecodeproject.com/csharp/GlobalSystemHook.asp
Werd ich mir mal reinziehen
-
cool
hätt ich nicht gedacht