窗口句柄能不能跨进程使用!?

xiangshifu99 2003-10-09 02:44:36
窗口句柄能不能跨进程使用!?

有3个进程 A,B,C

在A中取得B进程的一个窗口句柄,现传给C使用,不知道C得到的句柄有没有用?
...全文
598 18 打赏 收藏 举报
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
蒋晟 2003-10-12
同一个桌面上窗口句柄的可以跨进程使用


Command what is yours
Conquer what is not
  • 打赏
  • 举报
回复
sevencat 2003-10-12
GDI句柄可能就不行了。
贴一个枚举GDI句柄的代码。
一般来说GDI对象比较多一点。这个代码就是将所有的GDI对象解码出来。(有的可能没有,但我不知道问题出在什么地方)
是参考的那本windows图形编程里面的。


//gditable.h


#pragma once

#include "resource.h"
typedef unsigned (CALLBACK *proc0)(void);

struct GdiTableCell
{
void *pKernel;
//指向核心内存的指针,你是看不到的,
unsigned short nProcess;
//进程ID,你可以三个键一起按能看到。
unsigned short nCount;
//引用计数?
unsigned short nUpper;
//另一个放进程ID的地方
unsigned short nType;
//类型了,你自己试试看到底是什么类型吧。
void *pUser;
//有的GDI对象会将一些东西放到用户区,这个就是了(有可能DIB的图像区)
};

void init(GdiTableCell *&pGDITable);



// GdiTable.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "GdiTable.h"
#include <assert.h>
#include <stdio.h>
#include <time.h>
#define EVENT_TIME_FORMAT "%b %d %H:%M:%S"
#define EVENT_TIME_MAXLEN 32

int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE,LPTSTR,int)
{
GdiTableCell *pGDITable;
init(pGDITable);

FILE *filewrite=fopen("log.txt","a");
if(filewrite==NULL)
return 0;

char time_string[EVENT_TIME_MAXLEN];
time_t now;
struct tm * tmnow;
time(&now);
if (!(tmnow = localtime(&now)))
strcpy(time_string,"?");
else
strftime(time_string,EVENT_TIME_MAXLEN,EVENT_TIME_FORMAT,tmnow);
fprintf(filewrite,"Decode Gdi Table %s:\n",time_string);

for(int i=0;i<16384;i++)
{
if((pGDITable->pKernel!=NULL)&&(pGDITable->nProcess!=0))
{
fprintf(filewrite,"%8X %8d %8d %8d %8x %8X\n",pGDITable->pKernel,pGDITable->nProcess,pGDITable->nCount,pGDITable->nUpper,pGDITable->nType,pGDITable->pUser);
}
pGDITable++;
}
return 0;
}

void init(GdiTableCell *&pGDITable)
{
proc0 pGdiQueryTable=(proc0)GetProcAddress(GetModuleHandle("GDI32.dll"),"GdiQueryTable");
assert(pGdiQueryTable);

if(pGdiQueryTable)
pGDITable=(GdiTableCell*)pGdiQueryTable();
else
{
pGDITable=NULL;
MessageBox(NULL,"Error","error",MB_OK);
}
}
  • 打赏
  • 举报
回复
jerry 2003-10-12
窗口句柄是系统级的资源,可以跨进程使用的。

我经常这样用的
  • 打赏
  • 举报
回复
szjay 2003-10-12
这么多人说了,但没一个说得详细的
  • 打赏
  • 举报
回复
xiangshifu99 2003-10-10
大家应该用过SPY以及类似软件,注意了没有,每一个窗口都有一个不变的16进制字符串,如果没有猜错的话,那个应该是一个句柄!?我认为是可以了!
  • 打赏
  • 举报
回复
cchuocp 2003-10-10
句柄可以用,但只有部分消息可以用。
  • 打赏
  • 举报
回复
tryber 2003-10-10
窗口的句柄是在被销毁之前是唯一的,可以跨进程,跨线程, 放心用吧.
  • 打赏
  • 举报
回复
wangjs720 2003-10-10
sure
  • 打赏
  • 举报
回复
studyingpersons 2003-10-10
mark
  • 打赏
  • 举报
回复
finix 2003-10-10
1需要复制
DuplicateHandle
2利用继承性
前提进程间有关系.如A 创建B....
3命名
像CREATEEVENT()有个参数是名字
  • 打赏
  • 举报
回复
yaoha2003 2003-10-09
我只知道句柄在系统的某一时刻是唯一的,你这样能不能用我不知道,UP
  • 打赏
  • 举报
回复
szclm 2003-10-09
其实能不能用特别的标识呢,我们即然能枚举进程,那我们当然可以通过A进程,去枚举出B进程呀!如果你有对应的B进程的类格式,不就可以引用了吗?呵呵,不知我这样说对不对!
  • 打赏
  • 举报
回复
sevencat 2003-10-09
假如行的话,我能用这个句柄进行操作吗?

假如我能用他,就意味着我可以对任意的窗口进行操作?

有些GDI句柄是全局的(好像是画刷吧,用得比较多的那玩意儿)

句柄结构表一般是放在系统区的一个地方(不同的进程这个表的虚拟内存地址可能还不一样,不过有个未公开的API可以得到他)

很遗憾,句柄表是一个很长的数据(好像是64位的),有数据的真实地址,另外还有进程号,还有我记不清了,因此每个API调用句柄可能都会先查一下这个句柄是不是属于你这个进程的,假如不是的,根本不可能调用成功。
  • 打赏
  • 举报
回复
Agemo 2003-10-09
一个简单明了的怀疑就是,系统创建进程时,都相应给每个进程创建一个句柄索引表,既然句柄索引表是process-dependent的,那么肯定不能如楼主所述的那样使用。
  • 打赏
  • 举报
回复
Agemo 2003-10-09
我表示怀疑,不过没有细考虑。凭我现在大脑里的印象,我认为不可以的根据是:每个进程创建的时候,系统都给创建一个句柄表,其实每个进程所获得的句柄都是对系统资源的参考的索引,应该是indirect的,就是不是直接引用的。所以两个进程对同一个系统资源的句柄是未必相同的。所以对同一个进程A所创建的窗口,A使用此窗口的句柄是A进程的句柄索引表中的一个索引,B通过一个api函数调用,获得的同一个窗口资源的句柄是和A中的不一样的,虽然有可能两个索引都一样,同理,进程C必须自己调用api函数获得此窗口句柄才行,不能用B进程传过来的那个,虽然会因为巧合而可以使用。我的猜想是,当B进程调用api函数获得那个窗口资源时,所做的工作就是在进程B的句柄索引表中增加一项,真正的资源引用指针被作为值插入,对应此指针的有一个索引,此索引就被当作句柄返回给了用户进程使用。可以看windows核心编程,我的记忆力不太好,再加上工作后没有搞过windows的东西,所以可能记忆有误。反正我现在的回答是:不可以。
  • 打赏
  • 举报
回复
fengzi_zhu 2003-10-09
句柄是系统资源在句柄所对应的对象生存期内该句柄是唯一的。也就是不用进程在不同时刻使用同一个句柄时,不能保证该句柄的对象是否是同一个。
  • 打赏
  • 举报
回复
xiaohyy 2003-10-09
可以。。
  • 打赏
  • 举报
回复
yintongshun 2003-10-09
先形成实例再用
  • 打赏
  • 举报
回复
发帖
网络编程

1.8w+

社区成员

VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
帖子事件
创建了帖子
2003-10-09 02:44
社区公告
暂无公告