setwindowpos函数作用(api函数怎么调用)

setwindowpos函数作用(api函数怎么调用)

扫码添加渲大师小管家,免费领取渲染插件、素材、模型、教程合集大礼包!

大家好,今天来介绍setwindowpos函数作用(易语言的exe文件怎么破解)的问题,以下是渲大师小编对此问题的归纳和整理,感兴趣的来一起看看吧!

API函数setwindowpos及其它函数用法

函数
SetWindowPos
的用法
Declare
Function
SetWindowPos
Lib
"user32"
Alias
"SetWindowPos"
(ByVal
hwnd
As
Long,
ByVal
hWndInsertAfter
As
Long,
ByVal
x
As
Long,
ByVal
y
As
Long,
ByVal
cx
As
Long,
ByVal
cy
As
Long,
ByVal
wFlags
As
Long)
As
Long
这个函数能为窗口指定一个新位置和状态。它也可改变窗口在内部窗口列表中的位置。
返回值:Long,非零表示成功,零表示失败
参数说明
hwnd:欲定位的窗口
hWndInsertAfter:窗口句柄。在窗口列表中,窗口hwnd会置于这个窗口句柄的后面。也可能选备启察用下述值之一:
0
将窗口置于Z序列的顶部;Z序列代表在分级结构中,窗口针对一个给定级别的窗口显示的顺仿茄序
-1
将窗口置于列表顶部,并位于任何最顶部窗口的前面
-2
将窗口置于列表顶部,并位于任何最顶部窗口的后面
x
窗口新的x坐标。如hwnd是一个子窗口,则x用父窗口的客户区坐标表示
y
窗口新的y坐标。如hwnd是一个子窗口,则y用父窗口的客户区坐标表示
cx
指定新的窗口宽度
cy
指定新的窗口高度
wFlags
可以是下面一个值或几个数值的和
&H1
不改变大小
&H2
不改变位置
&H4
不改变Z序列(忽略
hWndInsertAfter
参旁启数)
&H10
不激活窗体
&H40
显示窗体
&H80
隐藏窗体
注解:窗口成为最顶级窗口后,它下属的所有窗口也会进入最顶级。一旦将其设为非最顶级,则它的所有下属和物主窗口也会转为非最顶级。Z序列用垂直于屏幕的一根假想Z轴量化这种从顶部到底部排列的窗口顺序

易语言的SetWindowPos

没用过这种语言,不过有这个函数的说明,你看一下:

许多软件,特别是占桌面面积不是很大的软件,通常都提供了一个常居顶端的功能(可能有的软件不是这么叫法,但作用是相同的),它的作用是保持窗口一直在其他窗口的上面,可以省去频繁切换窗口的动作。

如果你想这么做亏陆,有一个API可以实现: SetWindowPos,声明是这样的:

Private Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

虽然参数很多,但实际用起来很简单。hwnd是窗口的句柄,x、y、cx、cy分别是窗口的x和y坐标、宽和高度。hWndInsertAfter用来指定窗口的Z位置(或称Z顺序)。如果你经常接触3D方面的软件,你就知道Z代表深度。这个参数接受5种值:HWND_BOTTOM、 HWND_NOTOPMOST、HWND_TOP、HWND_TOPMOST或者另一个窗口的句柄。而wFlags用来指定附加的选项。

你可以用它改变窗口的位置和大小,而且它允许你同时改变Z位置(当然,在VB中不用API你也可以改变窗体大小和位置)。比如让窗口退到最下面,可以这么使用:

SetWindowPos Me.hWnd, HWND_BOTTOM, 10&, 10&, 80&, 120&, 0&

想要常居顶端,只需把HWND_BOTTOM改为 HWND_TOPMOST,而HWND_NOTOPMOST则是取消常居顶端,HWND_TOP是把窗口的Z位置改为最前。如果这个参数传递的是另一个窗口的句柄,则是把该窗口的Z 位置更改为在另一个窗口的下面。

非常简单的事情。不过如果像上面一样做,是不是单单改个Z位置也要计算窗口位置和大小?最后一个参数又是亮族干什么用的呢?wFlags可以让SetWindowPos忽略或执行某种行为。这里给出一部分:

SWP_DRAWFRAME和SWP_FRAMECHANGED:强制发送 WM_NCCALCSIZE消息给窗口

SWP_HIDEWINDOW:隐藏窗口

SWP_NOACTIVATE:不激活窗口

SWP_NOMOVE:保持当前位置(忽略销键顷x和y)

SWP_NOREDRAW:窗口不自动重画

SWP_NOSIZE:保持当前大小(忽略cx和cy)

SWP_NOZORDER:保持窗口在列表的当前位置(忽略hWndInsertAfter)

SWP_SHOWWINDOW:显示窗口

这些参数可以使用Or运算组合,所以如果你不希望改变窗口位置和大小,你只需要给最后一个参数传递(SWP_NOMOVE Or SWP_NOSIZE)即可。如下:

SetWindowPos Me.hWnd, HWND_TOPMOST, 0&, 0&, 0&, 0&, SWP_NOMOVE Or SWP_NOSIZE

这里的x、y、cx、cy的值将被忽略。其他值的组合,你可以自己去试试。
好了,这个看起来好像有点复杂的API已经变得很清晰,那么轮到上一话的收尾。

WM_NCCALCSIZE消息是在计算窗口的客户区大小时被发送的,它主要是让程序可以收到该消息后重新计算客户区的大小。我们先不管它是不是也能像许多以WM_开头的消息一样由我们发送给程序让它产生作用,但它使用起来的复杂程度让我宁可选择改变窗体大小再改回去。当我们改变窗口的大小时,很明显的就是它一定会重新计算客户区大小以调整外观。既然这个函数可以强制发送WM_NCCALCSIZE消息,那么我们就应该试一试。

SetWindowPos Me.hwnd, 0&, 0&, 0&, 0&, 0&, SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOMOVE Or SWP_FRAMECHANGED

为了不改变窗口大小、位置和Z顺序(就是要窗口保持原状),我使用SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOMOVE,让它忽略前面所有的参数,最后加个 Or SWP_FRAMECHANGED 就是让它重新计算客户区大小。把上面的一行放到前一话中更改风格的那一句下面,再执行程序。

delphi调用SetWindowPos函数 让当前窗口始终处在程序的最前面拜托各位大神

http:// ; www.neu.edu.cn ’, NULL, NULL, SW_SHOWNORMAL); 格式二: http://网站域名/网页文件名 。如:ShellExecute(Handle, "open", http:// ; www.neu.edu.cn/default.htm ',NULL,NULL, SW_SHOWNORMAL); 如果将FileName参数设置为“mailto:”协议格式,那么该函数将启动默认邮件客户程序,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若用户机器中安装了多个邮件客户程序,则该函数将根据Windows 9x/NT注册表中mailto协议处理程序的设置确定启动哪个邮件客户程序。 格式一:mailto: 如:ShellExecute(Handle,"open", "mailto:", NULL, NULL, SW_SHOWNORMAL);打开新邮件窗口。 格式二:mailto:用户账号@邮件服务器地址 如:ShellExecute(Handle, "open"," mailto: who@mail.neu.edu.cn ", NULL, NULL, SW_SHOWNORMAL);打开新邮件窗口,并自动填入收镇蠢嫌件人地址。若指定多个收件人地址,则收件人地址之间必须用分号或逗号分隔开(下同)。 格式三:mailto:用户账号@邮件服务器地址?subject=邮件主题&body=邮件正文 如:ShellExecute(handle, ‘open’, ‘ mailto: who@mail.neu.edu.cn ?subject=Hello&Body=This is a test’, nil, nil, SW_SHOWNORMAL);打开新邮件窗口,并自动填入收档芹件人地址、邮件主题和邮件正文。若邮件正文包括多行文本,则必须在每行文本之间加入换行转义字符%0a。 例子(delphi): 在一个应用程序调用c:\Project1.exe; ShellExecute(handle, 'open','c:\Project1.exe','字串内容',nil, SW_SHOWNORMAL); 在Project1.exe里可以调用: procedure TForm1.FormCreate(Sender: TObject); var i:integer; begin for i:=1 to paramcount do if ParamStr(i)'' then showmessage(ParamStr(i)); end; 最后的那个参数,为窗口指定可视性方面的一个命令。 请用下述任何一个常数 SW_HIDE 隐藏窗口,活动状态给令一个窗口 SW_MINIMIZE 最小化窗口,活动状态给令一个窗口 SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态 SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态 SW_SHOWMAXIMIZED 最大化窗口,并将其激活 SW_SHOWMINIMIZED 最小化窗口,并将其激活 SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口 SW_SHOWNA 用当前的御手大小和位置显示一个窗口,不改变活动窗口 SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口 SW_SHOWNORMAL 与SW_RESTORE相同

C++Builder开发Windows下的屏保

一。 引言
视窗系统下的屏幕保护程序是一个基于命令行(Command Line)的应用程序。当屏保程序被调用时操作系统就用具体的命令行执行该程序。本文组织和处理了所有的命令行,包括“/p”,“/s”,“/c”,“/a”,其中“/p”表示让屏保在预览窗口中显示:“/s”表示真正运行屏保:“/c”表示调用设置对话框;而“/a”表示调用密码设置对话框(WinNT中无效)。本程序尽可能简单地实现一个全功能的屏保,运行Windows的屏保设置程序时你既可以修改密码(WinNT中无效)又可以设置图片显示的频率并把频率数值保存到注册表里。当屏保运行时图片以你设置的频率改变显示位置。笔者还留了个作业给读者,请看图1中的选择图片文件夹这个项目,按下浏览按宴绝钮可以设置图片的路径,笔者已经实现了浏览按钮的功能并
把得到的路径也保存到注册表中,并让屏保启动时读picdir的值,picdir等于"no"时的代码笔者已实现了,picdir不等于"no"时的代码由读者实现。也就是让读者实现一个能把picdir目录里的图片轮流显示的屏保程序。
二。 实现方法
首先介绍几个API函数。
WinMain函数:
int WINAPI WinMain(HINSTANCE hInstance, // 当前实例句柄
HINSTANCE hPrevInstance, // 前一个实例句柄
LPSTR lpCmdLine, // 指向命令行参数的指针(本程序要利用的参数)
int nCmdShow // 窗口的状态);
GetWindowLong函数:得到指定窗口信息的函数
LONG GetWindowLong( HWND hWnd, //窗/口句柄
int nIndex //指/定返回的蔽祥枣信息);
SetWindowLong函数:改变窗口属性
LONG SetWindowLong(HWND hWnd, //窗/口句柄
int nIndex, // 指定要设定的值的信息
LONG dwNewLong // 新值);
SetParent函数:改变指定窗口的父窗口
HWND SetParent(HWND hWndChild, //要/改变父窗体的窗口句柄
HWND hWndNewParent //新/的父窗体的句柄);
GetClientRect函数:得到窗口的客户区
BOOL GetClientRect(HWND hWnd, // 窗口句柄
LPRECT lpRect //RECT/结构宏拆的地址);
SetWindowPos函数:改变窗口的大小,位置,顶级窗口等
BOOL SetWindowPos(HWND hWnd, // 窗口句柄
HWND hWndInsertAfter, // 布置窗口顺序的句柄(Z order)
int X, // horizontal position
int Y, // vertical position
int cx, // width
int cy, // height
UINT uFlags // 窗口位置等标记);
SystemParametersInfo函数:访问或设置系统级的参数
BOOL SystemParametersInfo(UINT uiAction, // 指定要获取或设置的系统参数
UINT uiParam, // depends on action to be taken
PVOID pvParam, // depends on action to be taken
UINT fWinIni // 用户配置文件是否改变标记);
ShowCursor函数:显示或隐藏光标
int ShowCursor(BOOL bShow // 鼠标可见度标记);
GetVersion函数:获取系统的版本信息
DWORD GetVersion(VOID)
以上API函数的具体信息可以查找有关MSSDK文档。了解了基本函数后笔者简述一下实现方法。
1. 新建一工程,增加两个窗体,将三个窗体分别取名为MainForm,FrmConfig,FrmControl.在MainForm和FrmControl窗体上各添加一个Timer控件和TImage控件,把两窗体的BorderStyle设为bsNone,背景色设为黑色。在两个窗体的TImage上各加一张图片,FrmControl大小设为:高130像素,宽160像素,Timage的Stretch属性设为真值。FrmConfig的样式如图1.
2. 保存工程文件为screensaver.cpp,其它单元分别存为Unitmain.cpp,
Unitcontrol.cpp,Unitconfig.cpp.
3. 编写代码,具体代码见第三部分的源程序。
4. 编译成可执行文件,并把文件扩展名改为scr.
5. 最后把屏保程序拷贝到windows目录下就可以测试了。如果一切正常的话你将会看
到图片在屏幕上以随机的位置显示。
三。 源代码
以下是本程序的所有的源代码,其中screensaver.cpp, Unitmain.cpp是核心代码。
/*{*}*/
/*{* screensaver.cpp }*/
/*{*}*/
//---------------------------------------------------------------------------/
#include
#pragma hdrstop
USERES("screensaver.res");
USEFORM("Unitmain.cpp", Frmmain);
USEFORM("Unitconfig.cpp", FrmConfig);
USEFORM("Unitcontrol.cpp", FrmControl);
//---------------------------------------------------------------------------/
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR p, int)//“p"是指向命令行参数的指针
{ String StartType;
AnsiString Command=p,temp;
HWND CPWindow =NULL;
if(Command=="")
StartType = "/c";
else
StartType=Command.SubString(1,2);//获取命令行的前两个参数
try
{
Application-Initialize();
if(StartType=="/c")//启动设置窗口
Application-CreateForm(__classid(TFrmConfig), FrmConfig);
else if(StartType=="/s")启动屏保
Application-CreateForm(__classid(TFrmmain), Frmmain);
else if(StartType=="/p")//预览
{
Application-CreateForm(__classid(TFrmControl), FrmControl);
temp=Command.SubString(3,Command.Length()-2);//获取命令行中的屏保预览窗口句柄的字符串形式
CPWindow =(long *)temp.ToInt();//将预览窗口句柄的字符串形式强制转换为长整形指针
RECT *lookrect;//建立一个RECT结构指针
Long style=GetWindowLong(Application-MainForm-Handle,GWL_STYLE);//获取FrmControl窗口的风格
style=styleWS_CHILD;
SetWindowLong(Application-MainForm-Handle,GWL_STYLE,style);//设置窗口为子窗口
SetParent(Application-MainForm-Handle,CPWindow);//设置屏保预览窗口为FrmControl的父窗口
GetClientRect(CPWindow,lookrect);//获取屏保预览窗口的客户区
SetWindowPos(Application-MainForm-Handle,HWND_TOP,0,0,lookrect-right,lookrect-bottom ,SW
P_NOZORDERSWP_NOACTIVATESWP_SHOWWINDOW);//将FrmControl的窗口覆盖屏保预览窗口的客户区,并显示它
}
else if(StartType=="/a")//启动密码设置窗口
{
temp=Command.SubString(3,Command.Length()-2);
CPWindow =(long *)temp.ToInt();//以下是动态调用mpr.dll里的PwdChangePasswordA函数的过程
typedef UINT(CALLBACK *FUN)(LPSTR,HWND,UINT,UINT);
HINSTANCE hDll=LoadLibrary("mpr.DLL");
FUN myfun;
if(hDll!=NULL)
{
myfun=(FUN)GetProcAddress(hDll,"PwdChangePasswordA");
if(!myfun)FreeLibrary(hDll);
else
myfun("SCRSAVE", CPWindow, 0, 0);//函数的调用
}
}
Application-Run();
}
catch (Exception exception)
{
Application-ShowException(exception);
}
return 0;
}
//---------------------------------------------------------------------------/
/*{*}*/
/*{*
Unitmain.h
}*/
/*{*}*/
//---------------------------------------------------------------------------/
#ifndef UnitmainH
#define UnitmainH
//---------------------------------------------------------------------------/
#include
#include
#include
#include
#include
#include
#include
//---------------------------------------------------------------------------/
class TFrmmain : public TForm
{
__published: // IDE-managed Components
TTimer *Timer1;
TImage *Image1;
void __fastcall FormCreate(TObject *Sender);
void __fastcall FormKeyDown(TObject *Sender, WORD Key,
TShiftState Shift);
void __fastcall FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y);
void __fastcall FormCloseQuery(TObject *Sender, bool CanClose);
void __fastcall FormClose(TObject *Sender, TCloseAction Action);
void __fastcall Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall Image1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y);
void __fastcall Timer1Timer(TObject *Sender);
private: // User declarations
DWORD PWProtect;
DWORD Version;
String picdir;
int frequence;
public: // User declarations
__fastcall TFrmmain(TComponent* Owner);
};
//---------------------------------------------------------------------------/
extern PACKAGE TFrmmain *Frmmain;
//---------------------------------------------------------------------------/
#endif
//---------------------------------------------------------------------------/
/*{*}*/
/*{* Unitmain.cpp
}*/
/*{*}*/
//---------------------------------------------------------------------------/
#include
#pragma hdrstop
#include
#include "Unitmain.h"
#include
//---------------------------------------------------------------------------/
#pragma package(smart_init)
#pragma resource "*.dfm"
TFrmmain *Frmmain;
//---------------------------------------------------------------------------/
__fastcall TFrmmain::TFrmmain(TComponent* Owner)
{
}
//---------------------------------------------------------------------------/
void __fastcall TFrmmain::FormCreate(TObject *Sender)
{
//使窗口成为最顶层的窗口
SetWindowPos(this-Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVESWP_NOSIZE);
//时窗口覆盖屏幕
this-Width=Screen-Width;
this-Height=Screen-Height;
this-Top=0;
this-Left=0;
Version=GetVersion();
TRegistry *Registry = new TRegistry;
try
{
if(Version0x80000000){
Registry-RootKey =HKEY_CURRENT_USER;
Registry-OpenKey("\Control Panel\Desktop",false);
PWProtect=Registry-ReadInteger("ScreenSaveUsePassword");//检测是否密码保护
Registry-CloseKey();}
Registry-RootKey =HKEY_CURRENT_USER;
Registry-OpenKey("\Software\CODEHUNTER", true);
picdir=Registry-ReadString("PicDir");//得到图片目录
frequence=Registry-ReadInteger("frequence");//得到图像显示的频率
if(picdir=="")picdir="no";
if(frequence0frequence6) frequence=2;
Timer1-Interval=1000*frequence;设置定时器
}#p#副标题#e#
__finally
{
delete Registry;
picdir="no";
}
//检测是否运行于 NT下
if(Version!=0)
if(PWProtectVersion0x80000000)//如果系统要求密码保护并此系统为非NT那么把系统设为屏保状态使光标消失
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, 0, 0);
while (!ShowCursor(false) -5);
}
//---------------------------------------------------------------------------/
void __fastcall TFrmmain::FormKeyDown(TObject *Sender, WORD Key,
TShiftState Shift)
{
this-Close();
}
//---------------------------------------------------------------------------/
void __fastcall TFrmmain::FormMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
this-Close();
}
//---------------------------------------------------------------------------/
void __fastcall TFrmmain::FormCloseQuery(TObject *Sender, bool CanClose)
{
if (PWProtect
Version0x80000000)
{
bool PassChck;
//显/示光标,并调用密码对话框
while(!ShowCursor(True)
5);
//以/下是VerifyScreenSavePwd函数的动态调用
typedef UINT(CALLBACK *FUN)(HWND);
HINSTANCE hDll=LoadLibrary("password.cpl");
FUN myfun;
if(hDll!=NULL)
{
myfun=(FUN)GetProcAddress(hDll,"VerifyScreenSavePwd");
if(!myfun)FreeLibrary(hDll);
else
PassChck=myfun(this-Handle);
}
if(PassChck == false)
{
while(!ShowCursor(False)
-5);
CanClose = false;
}
}
}
//---------------------------------------------------------------------------/
void __fastcall TFrmmain::FormClose(TObject *Sender, TCloseAction Action)
{
while(!ShowCursor(True)
5);
if(PWProtectVersion0x80000000)
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, 0, 0);//退出屏保状态
}
//---------------------------------------------------------------------------/
void __fastcall TFrmmain::Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
this-Close();
}
//---------------------------------------------------------------------------/
void __fastcall TFrmmain::Image1MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
static int MouseMoves=0;
MouseMoves = MouseM

分享到 :
相关推荐

.fr域名表示的是什么(fr域名表示的是什么)

.fr域名是法国(France)的国家域名。国际顶级域名。法国是一个国家。民族观念[...

常见的web漏洞有哪些(常见的web漏洞有哪些类型)

常见的web漏洞有哪些?互联网时代。很多业务都依赖于互联网。基于web环境的互联网应...

服务器是否遭遇攻击怎样看(怎么看服务器是否被攻击)

如何查看服务器被攻击?如果我们的服务器被攻击了。一般会有比较明显表现。例如网站访问变...

公司网站租用什么服务器靠谱(公司网站需要租服务器么)

目前。企业网站搭建可以选择配置的网站服务器类型较多。常见的有虚拟主机。VPS。云服务...

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注