这两个函数具体应用如下:SetWindowLong函数GetWindowLong函数

Delphi窗口化游戏

var

Thwnd:HWND;//声明变量 句柄变量

devmodel1:DEVMODE;//屏幕分辨率变量

style,exstyle:longint;//窗口属性变量

begin

//得到游戏句柄

Thwnd:findwindow('CLIENT',nil);

//设置分辨率

if EnumDisplaySettings(0,0,devmode1)then

  begin

    devmode1.dmPelsWidth:1024;

devmode1.dmPelsHeight:=768;

devmode1.dmBitsPerPel:=32;

devmode1.dmDisplayFrequency:=75;

    ChangeDisplaySetting(devmode1,0);

end;

//得到窗口原来的属性

style:=GetWindowLong(Thwnd,GWL_STYLE);

//定义新属性

style:=WS_OVERLAPPEDWINDOW or WS_VISIBLE;

//更改窗口属性

SetWindowLong(Thwnd,GWL_STYLE,style);

//得到窗口扩展属性

exstyle:=GetWindowLong(Thwnd,GWL_EXSTYLE);

//定义新扩展属性

exstyle:=WS_EX_APPWINDOW or WS_EX_WINDOWEDGE;

//更改窗口扩展属性

SetWindowLong(Thwnd,GWL_EXSTYLE,exstyle);

//更改的屏幕以屏幕的0,0为坐标,大小为800*600

SetWindowPos(Thwnd,HWND_NOTOPMOST,0,0,1020,768,SWP_SHOWWINDOW);

ShowWindow(Thwnd,SW_SHOWNORMAL);

二、WS_EX_APPWINDOW在任务栏显示图标

SetWindowLong(Handle,GWL_EXSTYLE,Style or WS_EX_APPWINDOW)

三、修改托盘相关信息

unit Unit1;

interface

uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,ShellApi,StdCtrls;

const
  //声明常量
  WM_MYNOTIFY=WM_USER+1000;//消息
  ID_MAIN=100;//定义图标的ID

type
  TForm1=class(TForm)
    Button1: TButton;
    Button2: TButton;

popupmenu1:TPopupmenu;
    procedure FormCreate(Sender:TObject);
    procedure FormClose(Sender: TObject;var Action: TCloseAction);
    //声明私有函数
    Function AddIcon(hwnd: HWND):Boolean;
    Function RemoveIcon(hwnd: HWND):Boolean;
    Procedure MyNotify(var Msg: TMessage);message WM_MYNOTIFY;

private
  {Privatedeclarations}
    ExitApp:Boolean;
  public
  {Publicdeclarations}
  end;

var
  Form1:TForm1;

implementation

{$R *.dfm}

//函数实现部分
Function TForm1.AddIcon(hwnd:HWND):Boolean;
var
  nid:NOTIFYICONDATA;//系统消息对象
begin
  nid.cbSize:=sizeof(NOTIFYICONDATA);//对象存储大小
  nid.Wnd:=hwnd;//消息对象句柄为窗口句柄
  nid.uID:=ID_MAIN;//图标的ID号
  nid.uFlags:=7; //NIF_MESSAGE or NIF_ICON or NIF_TIP;//响应的事件
  nid.uCallbackMessage:=WM_MYNOTIFY;//返回信息
  nid.hIcon:=Application.Icon.Handle;//图标
  strCopy(nid.szTip,'hello');//转换字符串格式
  AddIcon:=Shell_NotifyIcon(NIM_ADD,@nid);//添加到任务栏
end;

Function TForm1.RemoveIcon(hwnd:HWND):Boolean;
var
  nid:NOTIFYICONDATA;
begin
  nid.cbSize:=sizeof(NOTIFYICONDATA);
  nid.Wnd:=hwnd;
  nid.uID:=ID_MAIN;
  nid.uFlags:=0;
  RemoveIcon:=Shell_NotifyIcon(NIM_DELETE,@nid);
end;

Procedure TForm1.MyNotify(var Msg:TMessage);
var
mousept: TPoint;
begin
  if frm_login.Visible=false then
  begin
  case Msg.LParam of
    WM_LBUTTONDBLCLK:   //鼠标左键按下WM_LBUTTONDOWN,左键双击WM_LBUTTONDBLCLK,左键弹起WM_LBUTTONUP,右键弹起WM_RBUTTONUP
    begin
      ShowWindow(Handle, SW_SHOW);
      ShowWindow(Application.handle, SW_SHOW);
      SetWindowLong(Application.Handle, GWL_EXSTYLE,
      not (GetWindowLong(Application.handle, GWL_EXSTYLE)
      or WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW));
    end;
  end;
  case Msg.LParam of
    WM_RBUTTONUP:
    begin
      GetCursorPos(mousept);
      Form1.popupmenu1.popup(mousept.x, mousept.y);
    end;
  end;
  end;
end;

procedure TForm1.FormCreate(Sender:TObject);
begin
  ExitApp:=False;
  SetWindowLong(application.handle,gwl_exstyle,ws_ex_toolwindow);
  AddIcon(handle);//添加图标
end;

procedure TForm1.FormClose(Sender: TObject;var Action: TCloseAction);
begin
  if ExitApp then
  Action:= caFree
  else
  Action:= caNone;

//隐藏窗体.程序并没有退出
  ShowWindow(Handle, SW_HIDE);
  ShowWindow(Application.Handle, SW_HIDE);
  SetWindowLong(Application.Handle, GWL_EXSTYLE,
  GetWindowLong(Application.handle, GWL_EXSTYLE)
  or WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW);
end;

end.

四、从任务栏隐藏该使用

ShowWindow(Application.Handle,SW_HIDE);

显示

ShowWindow(Application.Handle,SW_SHOW);

五、

{将程序的窗口样式设为TOOL窗口,可避免在任务条上出现}

SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);

六、

参考:

如果你下载(源程序下载)并运行这个例程序,你会发现如果我们在托盘图标上点击鼠标右键,则会弹出一个右键菜单(如右图)。如果点击相应的菜单项,程序主窗体会随之变化,这样就可以控制程序的行为。而如果当主窗体处于最小化状态时,我们在托盘图标上点击左键,窗体会回复到原来的大小。其实实现上述的功能都要依赖于WINDOWS操作系统的消息机制,要完全弄懂这个机制挺不容易的,但是我们可以按下述文字来理解它。

    

SetWindowLong函数GetWindowLong函数的更多相关文章

  1. C++虚函数和函数指针一起使用

    C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...

  2. Oracle_SQL函数-分组函数

    分组函数 什么是分组函数 分组函数作用于一组数据,并对一组数据返回一个值 组函数类型:主要有6种 AVG - 平均 COUNT - 计数 MAX - 最大 MIN - 最小 SUM - 求和 STDD ...

  3. Oracle_SQL函数-单行函数

    SQL函数 SQL函数分类 SQL函数主要有两种,分为单行函数.多行函数 单行函数:只对一行进行变换,每行返回一个结果.可以转换数据类型,可以嵌套参数可以是一列或一个值 多行函数:多行函数,每次对一组 ...

  4. 12-返回指针的函数&&指向函数的指针

    前言 接下来我只讲指针的最常见用法,比如这一章的内容----返回指针的函数 与 指向函数的指针   一.返回指针的函数 指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的. 返回 ...

  5. JavaScript 闭包系列二(匿名函数及函数的闭包)

    一. 匿名函数 1. 函数的定义,可分为三种 1) 函数声明方式 function double(x) {     return 2*x; } 2)Function构造函数,把参数列表和函数体都作为字 ...

  6. javascript函数一共可分为五类: ·常规函数 ·数组函数 ·日期函数 ·数学函数 ·字符串函数

    javascript函数一共可分为五类:    ·常规函数    ·数组函数    ·日期函数    ·数学函数    ·字符串函数    1.常规函数    javascript常规函数包括以下9个 ...

  7. 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数

    [源码下载] 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函 ...

  8. PHP基于数组的分页函数(核心函数array_slice())

    关于数组的分页函数,用数组进行分页的好处是可以方便的进行联合多表查询,只需要将查询的结果放在数组中就可以了以下是数组分页的函数,函数page_array用于数组的分页,函数show_array用于分页 ...

  9. Python入门笔记(19):Python函数(2):函数/方法装饰器

    一.装饰器(decorators) 装饰器的语法以@开头,接着是装饰器函数的名字.可选参数. 紧跟装饰器声明的是被装饰的函数和被装饰的函数的可选参数,如下: @decorator(dec_opt_ar ...

随机推荐

  1. Linux操作系统的压缩、解压缩工具介绍

    Linux操作系统的压缩.解压缩工具介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.compress/uncompress命令常用参数 Linux compress命令: ...

  2. Python程序 #!/usr/bin/python 的解释

    关于脚本第一行的 #!/usr/bin/python 的解释,相信很多不熟悉 Linux 系统的同学需要普及这个知识,脚本语言的第一行,只对 Linux/Unix 用户适用,用来指定本脚本用什么解释器 ...

  3. 使用msRequestFullscreen全屏在IE 11无效

    问题产生原因:项目需要实现百度地图全屏的功能, 通过github上http://robnyman.github.io/fullscreen/这个demo初步实现在这个功能,在谷歌上也完美运行,而在ie ...

  4. Python基础之函数定义及文件修改

    函数 函数的定义 #登录函数和注册函数 def register(): """注册函数""" username = input('请输入你的 ...

  5. DataOps Reading Notes

    质量.效率.成本.安全,是运维工作核心四要素. AIOps 技术会涉及到数据收集方面的基础监控,服务监控和业务监控,甚至会涉及到与持续交付流水线的数据和状态整合(比如在软件发布的阶段会自动关闭某些监控 ...

  6. 微信小程序自动化jest模拟场景/切出/切入

    await miniProgram.evaluate(() => getApp().clickBanner({ path: "pages/game/home/home", q ...

  7. Pandas | 03 DataFrame 数据帧

    数据帧(DataFrame)是二维数据结构,即数据以行和列的表格方式排列. 数据帧(DataFrame)的功能特点: 潜在的列是不同的类型 大小可变 标记轴(行和列) 可以对行和列执行算术运算 结构体 ...

  8. selenium--更改标签的属性值

    前戏 在进行web自动化的时候,我们有时需要获取元素的属性,有时需要添加,有时需要删除,这时候就要通过js来进行操作了 实战 from selenium import webdriver import ...

  9. 洛谷 P4427

    传送门 洛谷P4427 题意: 给你一个数,然后让你求这两个数之间的点的深度的k次方和. #思路: 很容易想到lca.因为lca可以说是求树上两个点的距离的好方法.而且lca还能遍历每一个点. 然后我 ...

  10. 【字符串】【P5830】 【模板】失配树

    [字符串][P5830] [模板]失配树 Description 给定一个长度为 \(n\) 的字符串 \(S\),有 \(m\) 次询问,每次询问给定 \(S\) 的两个前缀,求它们的最长公共 bo ...