![]() |
Cursornamen Bestimmen
Hi.
Wirklich ein Super Forum hier :D. Bevor ich mich angemeldet hab hat mich google mit meinen Fragen schon oft hierher geführt. Zu meinem jetzigen Problemchen hab ich allerdings noch keine passende Lösung gefunden :(. Ich versuche den Cursornamen des momentan aktiven Cursors(Global) zu bestimmen. Dafür hab ich mir erstmal das Handle vom Cursor geholt mit: ico.Handle := GetCursor; Jedoch komme ich über das handle nicht an den cursornamen ? Oder doch ?. Wie könnte ich sonst an den namen kommen ?. -stiftII |
Re: Cursornamen Bestimmen
Du kannst Screen.Cursors (Screen aus Unit Forms) durchgehn und schauen, ob von Einem das Handle mit deinem übereinstimmt.
Der Index (wenn gefungen) würde dann dem "Namen" entsprechen. Name = KonstantenName (von z.B. crHelp) ... also brauchst du dann noch 'ne Tabelle mit den bekannten "Namen" und ihrem Wert/Index, in welcher du dann schaus, ob der Index/Wert dort enthalten ist; |
Re: Cursornamen Bestimmen
Nimm mal:
Delphi-Quellcode:
bekommst direkt den Cursornamen. Die Form1.Caption war nur, weil ich das getestet hab und schnell irgendein String zur Ausgabe braucht. Kannst natürlich alles nehmen, was du willst
Form1.caption := cursortostring(screen.Cursor);
MfG BAMatze |
Re: Cursornamen Bestimmen
Hallo.
Danke für die Antworten. Es funktioniert leider nicht. "cursortostring(screen.Cursor);" gibt immer dasselbe zurück(crDefault), selbst wenn sich der Cursor ändert. Grüße, stiftII |
Re: Cursornamen Bestimmen
Das gilt natürlich nur für dein eigenen Thread (deine Form). Wenn du andere außerhalb deiner Form identifizieren willst, musst du schon vorher (denke ich mal) nen globalen Maushook machen.
BAMatze |
Re: Cursornamen Bestimmen
Ich müsste den global bestimmen, also nicht nur in meiner Form, deswegen auch Windows API :).
~stift II |
Re: Cursornamen Bestimmen
Schau mal nach
![]() |
Re: Cursornamen Bestimmen
Zitat:
|
Re: Cursornamen Bestimmen
Zitat:
|
Re: Cursornamen Bestimmen
nunja dann bleibt dir aber die Möglichkeit wie himitsu vorgeschlagen hat, das gefundenen Handle mit den vorhandenen zu vergleichen.
Mist zu langsam |
Re: Cursornamen Bestimmen
Danke, werds mal probieren.
Uff.. Warum geht das hier nicht :( =
Delphi-Quellcode:
//EDIT: for i:=0 to high(Screen.Cursors) do begin // vergleichen end; Es muss nicht unbedingt der Name sein, hauptsache der cursor wird einwandfrei identifiziert :). |
Re: Cursornamen Bestimmen
Hallo nochmal.
Ich habe nun eine Für mich ausreichende Lösung gefunden aber stehe nun vor einem Neuen Problem. Ich habe diese Library erstellt, sie soll die Mauscursor als Grafik zurückgeben, bekomme allerdings den Fehler "[Error] causeddll2.dpr(25): Object or class type required" In der markierten Zeile (testbmp := TBitmap.Create;);
Delphi-Quellcode:
library causeddll2;
uses Messages, Variants, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Graphics, SysUtils, Classes, Windows, FastShareMem; {$R *.res} type TForm1 = class(TForm) end; function GetCursorBitmap:TBitmap; stdcall; var info: TCursorInfo; ico: TIcon; testbmp : TBitmap; begin [color=#ff005f][b] testbmp := TBitmap.Create;[/b][/color] info.cbSize := SizeOf(info); GetCursorInfo(info); ico := TIcon.Create; try ico.Handle := info.hCursor; testbmp.Width := ico.Width; testbmp.Height := ico.Height; testbmp.Canvas.Draw(0, 0, ico); result:= testbmp; finally ico.Free; end; end; function GetFunctionCount(): Integer; stdcall; export; begin Result:= 1; end; function GetFunctionInfo(x: Integer; var ProcAddr: Pointer; var ProcDef: PChar): Integer; stdcall; begin case x of 0: begin ProcAddr := @GetCursorBitmap; StrPCopy(ProcDef, 'function GetCursorBitmap(): TBitmap;'); end; else x := -1; end; Result := x; end; exports GetFunctionCount; exports GetFunctionInfo; end. |
Re: Cursornamen Bestimmen
iirc ist TBitmap auch in der Unit windows vorhanden. Lösung: in der uses Liste windfows an den anfang und vor classes/graphics/(wo auch immer das richtige tbitmap drin ist)
|
Re: Cursornamen Bestimmen
Oh, super. Vielen Dank.
Hat geklappt :) ~ stiftII |
Re: Cursornamen Bestimmen
Zitat:
|
Re: Cursornamen Bestimmen
Zitat:
Dachte nur, dass es noch immer zum Thema passen würde ;) |
AW: Cursornamen Bestimmen
Ich hänge mich hier mal dran.
Im Zuge der Suche nach einer Alternative zu ![]() Ich habe also inspiriert durch diesen Thread versucht festzustellen, wann der Cursor crHelp ist (also der Pfeil mit Fragezeichen):
Delphi-Quellcode:
Ich habe dann zwar das Handle des System-Cursors...aber ich komme ums verrecken nicht auf einen gescheiten Vergleich, um das Aussehen des Cursors festzustellen.
myCurInfo.cbSize := SizeOf(tagCursorInfo);
GetCursorInfo(myCurInfo); i := 0; repeat if Screen.Cursors[i] = myCurInfo.hCursor then // -> immer gleich egal welchen Wert i hat...gibt ja auch nur einen Mauspfeil begin if CursorToString(Screen.Cursors) = CursorToString(crHelp) then // -> nie gleich, vermutlich nennt VCL die Dinger halt anders i := Screen.CursorCount + 10 // Jajaja... else Inc(i); end else Inc(i); until i >= Screen.CursorCount; //CursorCount ist bei mir mit 4 recht klein...bedenkt man das es mindestens 10 verschiedene //System-Mauspfeile gibt. Hülfe? Sherlock |
AW: Cursornamen Bestimmen
Sodele habs erledigt. Da jegliche Abfrage des Cursors (ScreenCursors, GetCursorInfo, Control.Cursor, etc...) ums Verrecken nicht das korrekte Ergebnis liefert, scheint es sich an dieser Stelle um etwas ganz anderes zu handeln. Workaround ist zu ermitteln, ob denn das BorderIcon geklickt wurde, und das geht lächerlich einfach:
Delphi-Quellcode:
Im ClickEreignis eines jeden Controls kann nun auf biHelpClicked geprüft und entsprechend reagiert werden.
TMeinDialog = class(TForm)
. . . private biHelpClicked: Boolean; procedure wmNCLButtonDown(var Msg: TWMNCLButtonDown); message WM_NCLBUTTONDOWN; procedure wmNCLButtonUp(var Msg: TWMNCLButtonUp); message WM_NCLBUTTONUP; . . . procedure TMeinDialog.wmNCLButtonDown(var Msg: TWMNCLButtonDown); begin if Msg.HitTest = HTHELP then begin biHelpClicked := True; end; inherited; end; procedure TMeinDialog.wmNCLButtonUp(var Msg: TWMNCLButtonUp); begin if Msg.HitTest = HTHELP then begin biHelpClicked := True; end; inherited; end; Sherlock |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz