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

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

有3个进程 A,B,C

在A中取得B进程的一个窗口句柄,现传给C使用,不知道C得到的句柄有没有用?
...全文
806 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒋晟 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
  • 打赏
  • 举报
回复
先形成实例再用
VC获得进程ID获得主线程ID获得窗口句柄获得主窗口获得进程名 1.窗口类名 窗口句柄 窗口标题 窗口句柄 HWND FindWindow( LPCTSTR lpClassName, //窗口类名 可用 VC或者VS自带的Spy++查看 LPCTSTR lpWindowName //窗口标题 ); 举例: 以 记事本为例, 记事本 窗口类名 为:NotePad, 窗口标题 视按具体情况而定,假设为"新建 文本文档.txt - 记事本" 窗口类名 窗口句柄 TCHAR lpClassName[]=TEXT("NotePad"); HWND hWnd=::FindWindow(lpClassName,NULL); if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE); 窗口标题 窗口句柄 TCHAR lpWindowName[]=TEXT("新建 文本文档.txt - 记事本"); HWND hWnd=::FindWindow(NULL,lpWindowName); if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE); 2.窗口句柄 进程ID 窗口句柄 主线程ID 要使用到的函数: DWORD GetWindowThreadProcessId( HWND hWnd, //目标窗口句柄 LPDWORD lpdwProcessId //返回目标窗口对应进程ID ); 例子: DWORD dwProcId=0;//存放返回的进程ID DWORD dwThreadId=0;//存放返回的主线程ID HWND hWnd=XXXX;//这里省略,可能用任务方式得到一个窗口句柄.比如用1中的方法. dwThreadId=GetWindowThreadProcessId(hWnd,&dwProcId);//同时得到进程ID和主线程ID. 3.窗口HAND CWnd 用CWnd::FromHandle(HWND hWnd)函数.很多类都有这个函数. 4.进程进程ID (注:进程名,即在"任务管理器"中看到的名字) 用CCheckObject类(详细实现源文件); 例子: 以记事本为例,进程名为 NOTEPAD.EXE (不一定是大写哦,得到任务管理器是显示而定); CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); DWORD dwProcId=ch.GetProcessId(Name); 5. 进程名 主线程ID 例子: CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); DWORD dwThreadId=ch.GetThreadId(Name); 6. 进程名 主窗口句柄 CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); HWND hWnd=ch.GetTargetWindowHanle(Name); 7. 其它说明 从CCheckObject类和上面的源码中,不难写出从 进程ID 主线程ID 进程ID 主窗口句柄 主线程ID--->主窗口句柄 等等其它类似转换. 对于主窗口,特点如下: A. 不能进程ID,要用线程ID,因为一个进程可能有多个线程,每个线程都可能会有主窗口. B. 主窗口不会有WS_CHILD属性 C. 主窗口没有父窗口 D. 主窗口一般都有子窗口(这个不是一定的,但是具有普遍性)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧