python getwindowlongg和SetWindowLong表示什么意思

我发现这两个函数的功能真的不是一般的有意思,贴上这两个函数函数原型:
LONG WINAPI SetWindowLong(
_In_ HWND hWnd,
_In_ LONG dwNewLong
LONG WINAPI GetWindowLong(
_In_ HWND hWnd,
这两个函数的资料在度娘上面也是不胜枚举,同时本人在网络上翻看了诸多大牛的文章,大家对这两个函数的理解也都是入木三分。后来人便可综合大家的总结,更方便的理解这两个函数。但一是本人水平实在有限,二是为了不再给网络增加负担,所以本人决定理论的知识就不再赘述了,以免出现纰漏贻误后来人。而是通过亲身经历的两个小例子来展示一下这两个函数的强大之处。
1.设置窗口的透明属性。
&这段代码实现的功能就是让我们电脑上的计算器再透明一点,本来是这样的,然后我们写个程序使其变成这个鬼样子。
以SDK为例,我们新建一个默认工程,在默认工程的回调函数里,添加一个右键处理消息,当右键按下,获取计算器的句柄,其中类名或者窗口名,可以通过VS自带的SPY++获得(32位和64位版本要对应),然后通过这两个函数获取窗口属性,用SetLayeredWindowAttributes函数设置透明色。(前提是要打开计算器,使能够获取句柄成功)。代码如下:
WM_RBUTTONDOWN:
//获取计算器窗口句柄(这里也可以设置QQ了,英雄联盟了,等一系列窗口)
HWND hCalc=FindWindow(_T("CalcFrame"), NULL);//这个函数也是非常非常有意思的。
if (hCalc!=NULL)
//通过GetWindowLong获得窗口的属性
int ExdStyle = (int)GetWindowLong(hCalc, GWL_EXSTYLE);
//通过SetWindowLong设置窗口的属性,多增加了一个WS_EX_LAYERED支持透明
SetWindowLong(hCalc, GWL_EXSTYLE, ExdStyle | WS_EX_LAYERED);
//设置窗口的透明色
SetLayeredWindowAttributes(
hCalc, RGB(255, 255, 255),
100, LWA_ALPHA);//100代表透明度,0是全透明,255是不透明
2.改写回调函数过滤消息。
比如改写该进程下的回调函数,达到过滤右键按下的消息的目的
旧回调函数:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
switch (message)
case WM_CREATE:
//OldProc返回值是SetWindowLong原来的回调函数的地址
OldProc = (WNDPROC)SetWindowLong(hWnd, GWL_WNDPROC, (LONG)NewProc);
//程序主窗口此时的回调函数是NewProc而不是WndProc;
case WM_RBUTTONDOWN:
MessageBox(hWnd, _T("旧的窗口回调函数里"), _T("提示"), NULL);
case WM_DESTROY:
PostQuitMessage(0);
return DefWindowProc(hWnd, message, wParam, lParam);
新回调函数
LRESULT CALLBACK NewProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
switch (message)
case WM_RBUTTONDOWN:
MessageBox(hWnd, _T("新的窗口回调函数里"), _T("提示"), NULL);
//达到过滤消息后,恢复原来的回调函数,在OldProc中保存着
return CallWindowProc(OldProc, hWnd, message, wParam, lParam);
阅读(...) 评论()转:介绍shell_notifyicon,SendMessage,CallWindowProc,GetWindowLong,SetWindowLong的用法 - 笑笑小白 - 博客园
归类自己需要的资料,慢慢爬行
&&&|&|&管理
&&&|&|&管理
&&&|&|&管理
&&&|&|&管理
&&&|&|&管理
随笔 - 219下次自动登录
现在的位置:
& 综合 & 正文
GetWindowLong函数(最好的解释资料,绝对值得一看,此函数在子类化技巧时候经常用到)
今天在看一个里头写了GetWindowLong (hwnd, 0),我当时就有点费解,靠,上网
搜索函数原型说明,死活找不到第2个参数为0是指什么,MD,很恼火,最近终于在一个
国外网站找到,我在这篇贴了,网站是
先收集所有关于此函数的使用方法以及代码
希望后来的人看到我的这篇文章能感动哈:
函数功能描述:用这个函数能够获得指定窗口的信息
函数原型:LONG GetWindowLong( HWND hWnd,int nIndex )
参数:hWnd:指定窗口的句柄nIndex:需要获得的信息的类型
nIndex取值如下:GWL_EXSTYLE
得到扩展的窗口风格GWL_STYLE
得到窗口风格GWL_WNDPROC
得到窗口回调函数的地址,或者句柄。得到后必须使用CallWindowProc函数来调用 GWL_HINSTANCE
得到应用程序运行实例的句柄GWL_HWNDPARENT 得到父窗口的句柄GWL_ID
得到窗口的标识符GWL_USERDATA
得到和窗口相关联的32位的值(每一个窗口都有一个有意留给创建窗口的应用程序是用的32位
当hWnd标识一个对话框时可以使用下面的值Value Action DWL_DLGPROC
得到对话框回调函数的地址,或者句柄。得到后必须使用CallWindowProc函数来调用 DWL_MSGRESULT 得到对话框回调函数中消息处理过程的返回值DWL_USER
得到额外的应用程序私有信息,如一些句柄和指针等
返回值:成功时,返回一个请求的32位的值失败时,返回0,可以使用GetLastError来取得错误信息
/**//** Window field offsets for GetWindowLong()*/#define GWL_WNDPROC (-4)#define GWL_HINSTANCE (-6)#define GWL_HWNDPARENT (-8)#define GWL_STYLE (-16)#define GWL_EXSTYLE (-20)#define GWL_USERDATA (-21)#define GWL_ID (-12)/**//** Get/SetWindowWord/Long offsets for use with WC_DIALOG windows*/#define DWL_MSGRESULT 0#define DWL_DLGPROC 4#define DWL_USER 8
示例1:long nStyle = ::GetWindowLong(hWnd, GWL_STYLE);
// hWnd是一个编辑框的句柄if(nStyle & ES_PASSWORD){
AfxMessageBox("这是一个密码域");}
GetWindowLong(
第二个参数是0的话,就是指定GW_HWNDFIRST!!!
你想用应用程序自定义数据的话,需要指定第二个参数为GWL_USERDATA(-21)
、、、、、、、、、、、、、、、、、、
SetWindowLong
<span style="COLOR: #,
<span style="COLOR: #^GetWindowLong
<span style="COLOR: #))
小弟初学API,对这个函数不是很了解,看了MSDN也还不清楚,特别是作为参数的1^GetWindowLong
<span style="COLOR: #),这个“^”是什么意思,望高手指点迷津
SetWindowLong函数,该函数将改变指定窗口的特殊属性.下面是它的声明:
SetWindowLong
"SetWindowLongA"(ByVal
Long,ByVal
第一个参数代表要进行子类处理的窗口,第二个参数应该是GWL_WNDPROC(-<span style="COLOR: #),第三个参数是新的窗口函数的地址
此函数将在窗口取得焦点,发生事件,或其他情况下(如其他进程改变了系统的某些参数)被随时调用.
如果发生错误SetWindowLong函数将返回0,否则将返回原来的窗口函数的地址.这个地址特别重要,你应该把它保存在一个变量中或其他地方.当你不处理某些消息时(实际上,你可能只处理不到1%的消息,其他的都将由原窗口函数处理),调用原来的窗口函数就需要该地址.
/**/////////////////////////////////////////////////////////////////////////////////////////////其他人提出的疑问::::::^是异或。
因为GetWindowLong失败后返回0,这条语句的意思就是说当窗口没有这种属性的时候才给它添加这种属性。通俗点说,就是先Get,得不到,再Set。
0设置的是什么属性呢?二楼的说应该是GWL_WNDPROC(-<span style="COLOR: #),依据是什么?
<span style="COLOR: #楼yxwmxkq(酷得经动了党)回复于 <span style="COLOR: #02-<span style="COLOR: #-<span style="COLOR: # <span style="COLOR: #:<span style="COLOR: #:<span style="COLOR: # 得分 <span style="COLOR: # 我的目的是:创建子类时:CreateWindow(...,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
我只是想确定一下,SetWindowLong(hwnd,<span style="COLOR: #,<span style="COLOR: #)是不是把extra
中的long置0,而SetWindowLong(hwnd,<span style="COLOR: #,<span style="COLOR: #)则置为1,如果不是,该如何设置SetWindowLong函数使extra
中的Long型数值为0或1,当然0和1的变换我用1^GetWindowLong(hwnd,<span style="COLOR: #)不知是否正确。3x!!Top<span style="COLOR: # 楼sans(长风半日)回复于 <span style="COLOR: #02-<span style="COLOR: #-<span style="COLOR: # <span style="COLOR: #:<span style="COLOR: #:<span style="COLOR: # 得分 50如果要操作User
data,你首先要在该窗口WNDCLASS的cbWndExtra中设定扩展数据的大小,然后RegisterClass,之后使用GetWindowLong(
GWL_USERDATA
<span style="COLOR: #
);、GetWindowLong(
GWL_USERDATA
<span style="COLOR: #
);等进行读操作,使用SetWindowLong(
GWL_USERDATA
<span style="COLOR: #,
);、SetWindowLong(
GWL_USERDATA
<span style="COLOR: #,
);等进行写操作。
&&&&推荐文章:
【上篇】【下篇】Windows编程(7)
1.LONG SetWindowLong( HWND hWnd,&int nIndex,&LONG dwNewLong&);&
这个函数根据nIndex的取&#20540;不同,可以实现不同的功能.&
其中nInde可以取:&
GWL_EXSTYLE: 设置窗口扩展风&#26684;,即CreateWindowEx的DWORD wExStyle 参数&
GWL_STYLE: 设置窗口风&#26684;,即CreateWindow的DWORD dwStyle参数&
GWL_WNDPROC: 设置窗口的处理函数,即RegisterClass的WNDCLASSEX的WNDPROC lpfnWndProc成员&
GWL_HINSTANCE: 设置窗口所属的应用程序句柄,即RegisterClass的WNDCLASSEX的HINSTANCE hInstance成员&
GWL_ID 设置窗口的ID(对于控件,就是控件ID)&
GWL_USERDATA: 设置窗口的用户自定义数据&
DWL_DLGPROC: 设置对话框处理函数&
DWL_MSGRESULT: 设置对话框消息处理的结果&#20540;&
DWL_USER: 设置扩展区域数据&
2.LONG GetWindowLong(HWND hWnd,int nlndex)
第二个参数和SetWindowLong的第二个参数一样,取出对应的属性&#20540;
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7597次
排名:千里之外
原创:27篇
(5)(6)(13)(2)(2)(5)(1)}

我要回帖

更多关于 getwindowlong 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信