Autor Beitrag
MephistoFFF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60

Win 7

BeitragVerfasst: Sa 17.01.15 20:34 
Hallo!

Ich habe mir ein Programm geschrieben welches aus TPanels einen Rahmen um eine Fremde Anwendung legt. Der Rahmen verdeckt dabei vollständig den originalen Fensterrahmen der Anwendung.
Ich will nun das Fremde Fenster inklusive meines Rahmen verschieben, indem ich das obere TPanel geklickt halte und es mit der Maus verschiebe. Mein Programm hat Borderstyle BSnone.

Ich habe folgendes versucht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.PanelTopMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Var
  TS3Handle : THandle;
begin
   TS3Handle := FindWindow(nil'TeamSpeak 3');
   ReleaseCapture;
   TS3Handle.Perform(wm_syscommand,$f0120);
end;


Das ganze gibt beim kompilieren den Fehler "Illegal qualifier" für Zeile 8

Weiterhin habe ich versucht stattdessen folgendes zu verwenden :
ausblenden Delphi-Quelltext
1:
SendMessage(TS3Handle, WM_SYSCOMMAND,$f0120);					

Das kompiliert zwar, funktioniert aber nicht.

Ist das überhaupt möglich? Danke!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 17.01.15 21:25 
Das wird so nicht gehen. Ich glaube du hast nicht ganz verstanden wie das funktioniert...
Mit dem Befehl kannst du dafür sorgen, dass du das Fenster, auf dem das Control liegt, an das du den Befehl schickst, durch Ziehen des Controls bewegst.

Die einzige Möglichkeit wäre, auf die Bewegung des Fensters zu reagieren und das andere mitzuziehen. Das funktioniert aber nicht sonderlich gut.

Du könntest das andere Fenster aber auch einfach mit SetParent auf dein eigenes Fenster legen und den Fensterrand ausblenden.

Was möchtest du denn eigentlich erreichen? Geht es dir um das Styling des Fensterrahmens?
MephistoFFF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60

Win 7

BeitragVerfasst: Sa 17.01.15 21:47 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Was möchtest du denn eigentlich erreichen? Geht es dir um das Styling des Fensterrahmens?


Ja, darum geht es mir. Ich nutze viele Programme mit einem Skin im Metro Design (Stil von Windows 8). Und besagtes Programm unterstützt zwar Skins, aber diese beeinflussen den Fensterrahmen nicht.
Wie funktioniert das SetParent denn im groben?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 17.01.15 22:01 
Da kenne ich ne einfachere Variante: Einfach Windows 8 benutzen, da ist dann auch gleich das ganze System besser und nicht nur das Aussehen... :wink:

SetParent hat ja nur zwei Parameter, siehe Doku:
msdn.microsoft.com/d...41%28v=vs.85%29.aspx
Eigentlich selbsterklärend...
In deinem Fall:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
var
  TS3Handle : THandle;
begin
  TS3Handle := FindWindow(nil'TeamSpeak 3');
  SetParent(TS3Handle, Handle);
MephistoFFF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60

Win 7

BeitragVerfasst: So 18.01.15 12:54 
Habe es jetzt anders gelöst:

Ich setze im "Panel1.OnMouseEnter"
ausblenden Delphi-Quelltext
1:
 SetWindowLong(Handle, GWL_EXSTYLE, getWindowLong(Handle, GWL_EXSTYLE) or WS_EX_TRANSPARENT or WS_EX_LAYERED);					

Damit ist das Panel "durchklickbar" und der Klick wird an das dahinterliegende Fenster gesendet, welches ich nun verschieben kann :) .

Jetzt schaffe ich es nur nicht das ganze im "Panel1.OnMouseLeave" rückgängig zu machen =/ .
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 18.01.15 13:48 
Weil du das Ereignis nicht mehr bekommst, weil dein Panel ja jetzt nicht mehr den Fokus hat, sondern das andere Programm. Das wirst du so auch nicht hinbekommen außer mit einem Maushook (für den du glücklicherweise anders als bei anderen Hooks keine extra DLL benötigst, die dann nämlich oft als Virus erkannt würde).
MephistoFFF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60

Win 7

BeitragVerfasst: Mo 19.01.15 18:11 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Weil du das Ereignis nicht mehr bekommst, weil dein Panel ja jetzt nicht mehr den Fokus hat, sondern das andere Programm. Das wirst du so auch nicht hinbekommen außer mit einem Maushook (für den du glücklicherweise anders als bei anderen Hooks keine extra DLL benötigst, die dann nämlich oft als Virus erkannt würde).


Gäbe es denn theoretisch einen SetWindowLong-Befehl um das Fenster wieder in den Fokus zu holen und in einen "nicht durchklickbaren Zustand" zu setzen? Den Befehl könnte ich ja an anderer Stelle ausführen. Habe dazu aber leider nichts gefunden.