绑架窗体之Delphi版

2016-02-19 18:24 6 1 收藏

有一种朋友不在生活里,却在生命力;有一种陪伴不在身边,却在心间。图老师即在大家的生活中又在身边。这么贴心的服务你感受到了吗?话不多说下面就和大家分享绑架窗体之Delphi版吧。

【 tulaoshi.com - 编程语言 】

 

  “绑架窗体”:顾名思义,就是将其它应用程序甚至系统程序的窗体活生生地拖进本程序的窗体内。这种未征得其它程序同意的强行“绑架”行为在某些场合下却能发挥出非常独特的作用。本文将讨论“绑架”窗体的技术及应用,并给出了一个完整的“强盗”程序的例子。
  从技术上讲,为了实现“绑架”,“强盗”程序中必须要有一个 MDIForm对象。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  
  实现“绑架”的第二个条件,是必须知道被“绑架”窗体的句柄。做到这一点并不难。比如,当鼠标在屏幕上滑动时,我们可以用 API函数GetCursorPos来获得鼠标指针的当前位置坐标,然后用另一个 API函数 WindowFromPoint来获得指定点窗口的句柄。或者使用FindWindow获得窗口句柄。
  有了上述两个条件,“强盗”程序就可以开始实施“绑架”了:首先用 API函数GetWindow 的GW_CHILD命令来寻找本程序第一个子窗口的句柄;然后用另一个 API函数 SetParent为被“绑架”窗体指定一个“新父”,即指向上面的子窗口的句柄。立刻,两个原本毫无关系的窗体具有了“父子”关系:被“绑架”窗口出现在“强盗”窗体内部!
  二、“绑架”的安全性
  不分青红皂白地进行“绑架”是非常危险的。但只要遵守以下两个原则就可以保证安全性:
  第一,在关闭“强盗”程序之前,把被“绑架”窗体用 SetParent函数“释放”掉,即恢复被“绑架”者的原来的“父亲”。
  第二,不要“绑架”系统窗口。系统窗口一般有:任务栏窗口、按下“开始”产生的窗口、按下“Ctrl+Alt+Del”产生的窗口,点击鼠标右键产生的窗口,等等。
  绑架”技术在VB中有广泛的应用,例如,可在程序运行中将控件置入容器控件内部(比如将一个按钮设成图象或窗体控件的子窗口),或者将控件从一个容器移至窗体中的另一个。

  
  代码:
  在窗体的private中定义  
  hwndOldParent:HWND;
      hwndNotePad:HWND;

  将窗口的FormStyle设为fsMDIForm

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  procedure TForm1.Button1Click(Sender: TObject);
  begin
  hwndNotePad:=FindWindow(PChar('Notepad'),0);
  hwndOldParent:=GetParent(hwndNotePad);
  Windows.SetParent(hwndNotePad,handle);

  end;

  procedure TForm1.FormDestroy(Sender: TObject);
  begin
  Windows.SetParent(hwndNotePad,hwndOldParent);
  end;

  更多请见:http://lincosoft.go.nease.net/

来源:https://www.tulaoshi.com/n/20160219/1617573.html

延伸阅读
如何移动没有Title的窗体。 private void label1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { mouse_offset = new Point(-e.X, -e.Y); } private void label1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { if (e.Button == MouseButtons.Left) { Point mousePos = Control.MousePos...
import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.UIManager; class Mywindow extends JFrame { JButton button1; JButton button2; JInternalFrame interframe1,interframe2; JPanel jpanel; Mywindow() { setVisible(true); //setSize(400,400)见下面的说明! jpanel=(JPanel)this.getContentPane(); ...
标签: Web开发
对于下载时新打开一窗口下载,下载完后需要关闭的 一种:对于较小文件可以有效: System.IO.FileInfo file = new System.IO.FileInfo("F:mp3mp3别哭我最爱的人.mp3");    Response.Clear();    Response.ClearHeaders();    Response.Buffer = false;    Response.Charse...
标签: Delphi
一、组件的简要层次结构 一般情况下,VCL的组件可以从Tcomponent为开始。其最明显的特征就是它的属性可以在设计时通过对象察看器来操纵,另外,他还能拥有其他组件。 从Tcomponent下,分出非可视组件和可视组件。 非可视组件如TOPenDialog,TTimer,TTable等,这些组件因为继承自Tomponent,所以也就继承了在设计时可以被...
标签: Delphi
   Delphi 编辑器   在表面上,对IDE的第7个版本来说Delphi的编辑器看来似乎没有改变许多。 然而,在幕后,它是一个全新的工具。 除了用它来处理Object Pascal 语言(或者Delphi语言,Borland   现在喜欢如此称呼它)的文件之外,你现在能使用它来处理其它用于Delphi开发(诸如SQL,XML,HTML,和XSL文件)的文件...

经验教程

180

收藏

31
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部