社区
网络编程
帖子详情
窗口句柄能不能跨进程使用!?
xiangshifu99
2003-10-09 02:44:36
窗口句柄能不能跨进程使用!?
有3个进程 A,B,C
在A中取得B进程的一个窗口句柄,现传给C使用,不知道C得到的句柄有没有用?
...全文
806
18
打赏
收藏
窗口句柄能不能跨进程使用!?
窗口句柄能不能跨进程使用!? 有3个进程 A,B,C 在A中取得B进程的一个窗口句柄,现传给C使用,不知道C得到的句柄有没有用?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
先形成实例再用
通过
进程
ID找到
窗口
句柄
.
通过
进程
ID找到
窗口
句柄
.通过
进程
ID找到
窗口
句柄
.通过
进程
ID找到
窗口
句柄
.通过
进程
ID找到
窗口
句柄
.通过
进程
ID找到
窗口
句柄
.通过
进程
ID找到
窗口
句柄
.通过
进程
ID找到
窗口
句柄
.通过
进程
ID找到
窗口
句柄
.
VC
进程
ID获得主
窗口
句柄
获得
进程
名
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. 主
窗口
一般都有子
窗口
(这个不是一定的,但是具有普遍性)
通过
进程
id获取主
窗口
句柄
及主
窗口
标题
通过
进程
id获取到所在
进程
的主
窗口
的
句柄
,及通过该主
窗口
句柄
获取当前主
窗口
的标题,
进程
名;这是一个demo例程,仅供参考
易语言通过
窗口
句柄
取得
进程
ID
易语言通过
窗口
句柄
取得
进程
ID源码,通过
窗口
句柄
取得
进程
ID,
句柄
获得
进程
ID_DLL
取
窗口
句柄
+
进程
名+
进程
ID
取指定标题
窗口
的
句柄
,
进程
名,
进程
ID 取指定标题
窗口
的
句柄
,
进程
名,
进程
ID 取指定标题
窗口
的
句柄
,
进程
名,
进程
ID 取指定标题
窗口
的
句柄
,
进程
名,
进程
ID 取指定标题
窗口
的
句柄
,
进程
名,
进程
ID
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章