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 Anklickbares, unsichtbares Fenster (https://www.delphipraxis.net/118560-anklickbares-unsichtbares-fenster.html)

Neutral General 10. Aug 2008 13:02


Anklickbares, unsichtbares Fenster
 
Hi,

Ist es irgendwie möglich ein Fenster zu erstellen, das unsichtbar ist, aber trotzdem die WM_LBUTTONDOWN/WM_LBUTTONUP Message zu empfangen?

Ich bräuchte sowas :?

Gruß
Neutral General

HalloDu 10. Aug 2008 13:05

Re: Anklickbares, unsichtbares Fenster
 
Die einzige Möglichkeit die mir einfallen würde ist ein Maushook, bei dem du prüfst, ob der Klick in deinem Fenster war.

Neutral General 10. Aug 2008 13:12

Re: Anklickbares, unsichtbares Fenster
 
Hi,

Ja an sowas in der Art dachte ich auch schon. Allerdings würde das mein Vorhaben sinnlos machen :mrgreen:

Also was ich vorhabe, bzw mal probieren wollte ist folgendes.

Nachdem ich diesen Thread verfolgt habe, wollte ich versuchen ob sich das über AllocateHwnd bzw generell unsichtbare Fenster, die über dem Sprite schweben gelöst werden könnte und man dann für ein OnClick nur noch eine Window Message empfangen müsste, statt groß rumzurechnen (und auch GetSpriteAt rechnet ja intern, bzw geht alle (sichtbaren?) Sprites durch).

Von daher nutzt es mir nichts wenn ichs jetzt mit nem Hook löse :mrgreen:

lbccaleb 10. Aug 2008 13:13

Re: Anklickbares, unsichtbares Fenster
 
Hey,

das sollte gehen, wenn du das Fenster mit folgender Prozedure Transparent zeichnest:


Delphi-Quellcode:
procedure MakeWindowTransparent(Wnd: HWND; Alpha: Byte);
const
  WS_EX_LAYERED = $80000;
  LWA_ALPHA    = $02;
type
  TSetLayeredWindowAttributes = function(const hWnd: HWND; crKey: Integer; bAlpha: Byte; dwFlags: Integer) : Integer; stdcall;
var
  SetLayeredWindowAttributes : TSetLayeredWindowAttributes;
  User32DLL                 : THandle;
begin
  User32DLL := LoadLibrary('User32.dll');
  if User32DLL <> 0 then
  begin
    @SetLayeredWindowAttributes := GetProcAddress(User32DLL, 'SetLayeredWindowAttributes');
    if @SetLayeredWindowAttributes <> nil then
    begin
      SetWindowLong(Wnd, GWL_EXSTYLE, GetWindowLong(Wnd, GWL_EXSTYLE) or WS_EX_LAYERED);
      SetLayeredWindowAttributes(Wnd, 0, Alpha, LWA_ALPHA);
    end;
  end;
  FreeLibrary(User32DLL);
end;

und dann auf die Messages reagierst!

Aufrufen musst du die Funktion dann so:

Delphi-Quellcode:
MakeWindowTransparent(DeinFensterhandle,1);
//Ob es auch mit 0 geht weiß ich nciht musst du ausprobieren...
//das währe dann wirklich unsichtbar

turboPASCAL 10. Aug 2008 13:15

Re: Anklickbares, unsichtbares Fenster
 
Klar geht das, AlphaBlend auf Ture und AlphaBlendValue auf 1 (oder sogar null).

Neutral General 10. Aug 2008 13:18

Re: Anklickbares, unsichtbares Fenster
 
Zitat:

Zitat von turboPASCAL
Klar geht das, AlphaBlend auf Ture und AlphaBlendValue auf 1 (oder sogar null).

Muss ja non-VCL sein. Ich benutze AllocateHwnd.

Und scheinbar funktioniert MakeWindowTransparent nicht mit diesen Fenstern :gruebel:

Delphi-Quellcode:
// Nur eine Test-Methode! 
procedure THandleSprite.Apply;
begin
  SetParent(Fhandle,Form1.Handle);
  SetWindowPos(FHandle,HWND_BOTTOM,0,0,Round(Width),Round(Height),0);
  ShowWindow(FHandle,SW_SHOW);
  MakeWindowTransparent(FHandle,1);
end;

turboPASCAL 10. Aug 2008 13:21

Re: Anklickbares, unsichtbares Fenster
 
@ N.G. Da waren die anderen Beiträge noch nicht da...

Ich würde die Sprides & Mousepos. errechnen, das ist schneller und sauberer als dieses Kuddelmuddel mit unsichtbaren Fenster, Hooks etc.


(Gesausogut könnte man flacker TImages verschieben :stupid: :snowball: )


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:40 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