Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Cursornamen Bestimmen (https://www.delphipraxis.net/139669-cursornamen-bestimmen.html)

stiftII 2. Sep 2009 17:55


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

himitsu 2. Sep 2009 18:26

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;

BAMatze 2. Sep 2009 18:28

Re: Cursornamen Bestimmen
 
Nimm mal:

Delphi-Quellcode:
Form1.caption := cursortostring(screen.Cursor);
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

MfG
BAMatze

stiftII 2. Sep 2009 18:38

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

BAMatze 2. Sep 2009 18:41

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

stiftII 2. Sep 2009 18:55

Re: Cursornamen Bestimmen
 
Ich müsste den global bestimmen, also nicht nur in meiner Form, deswegen auch Windows API :).

~stift II

DeddyH 2. Sep 2009 19:01

Re: Cursornamen Bestimmen
 
Schau mal nach MSDN-Library durchsuchenGetCursorInfo.

stiftII 2. Sep 2009 19:19

Re: Cursornamen Bestimmen
 
Zitat:

CURSORINFO Structure

The CURSORINFO structure contains global cursor information.

Syntax

typedef struct {
DWORD cbSize;
DWORD flags;
HCURSOR hCursor;
POINT ptScreenPos;
} CURSORINFO, *PCURSORINFO, *LPCURSORINFO;

Members

cbSize
Specifies the size, in bytes, of the structure. The caller must set this to sizeof(CURSORINFO).
flags
Specifies the cursor state. This parameter can be one of the following values.

0
The cursor is hidden.
CURSOR_SHOWING
The cursor is showing.

hCursor
Handle to the cursor.
ptScreenPos
A POINT structure that receives the screen coordinates of the cursor.
Es gibt leider nicht den namen zurück, nur die Position, das Handle und die Sichtbarkeit. :(

DeddyH 2. Sep 2009 19:22

Re: Cursornamen Bestimmen
 
Zitat:

Zitat von himitsu
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.


BAMatze 2. Sep 2009 19:24

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

stiftII 2. Sep 2009 19:56

Re: Cursornamen Bestimmen
 
Danke, werds mal probieren.

Uff..
Warum geht das hier nicht :( =

Delphi-Quellcode:
   
  for i:=0 to high(Screen.Cursors) do
  begin
    // vergleichen
  end;
//EDIT:
Es muss nicht unbedingt der Name sein, hauptsache der cursor wird einwandfrei identifiziert :).

stiftII 2. Sep 2009 22:53

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.

jfheins 2. Sep 2009 22:56

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)

stiftII 2. Sep 2009 23:03

Re: Cursornamen Bestimmen
 
Oh, super. Vielen Dank.

Hat geklappt :)

~ stiftII

Luckie 2. Sep 2009 23:31

Re: Cursornamen Bestimmen
 
Zitat:

Zitat von stiftII
stehe nun vor einem Neuen Problem.

Dann erstelle beim nächsten mal bitte auch einen neuen Thread.

stiftII 3. Sep 2009 11:34

Re: Cursornamen Bestimmen
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von stiftII
stehe nun vor einem Neuen Problem.

Dann erstelle beim nächsten mal bitte auch einen neuen Thread.

Wird gemacht.

Dachte nur, dass es noch immer zum Thema passen würde ;)

Sherlock 21. Mär 2013 09:37

AW: Cursornamen Bestimmen
 
Ich hänge mich hier mal dran.
Im Zuge der Suche nach einer Alternative zu http://www.delphipraxis.net/1207959-post1.html versuche ich das Handling mehr oder weniger selbst zu erledigen. Da ich das nur auf besagte Groupboxen anwenden möchte, sollte es recht einfach sein.
Ich habe also inspiriert durch diesen Thread versucht festzustellen, wann der Cursor crHelp ist (also der Pfeil mit Fragezeichen):
Delphi-Quellcode:
  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.
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.
Hülfe?

Sherlock

Sherlock 22. Mär 2013 09:18

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:
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;
Im ClickEreignis eines jeden Controls kann nun auf biHelpClicked geprüft und entsprechend reagiert werden.

Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz