问 老李 一个编程方面的问题
知道进程 的 id怎么 找到 窗口的句柄。。。请给出代码。。。。最好是 C++的。。。 老李和大家一起滑雪去了。
在我的印象里,并不是所有的进程都有窗口句柄的,但所有的窗口却都会有对应的进程。
所以,问题可以转化为:在已知的窗口句柄和进程ID对应表中,查找一个进程ID,若找到,则给出其窗口句柄。
那么方法就非常简单了:
1. 获取全部窗口句柄(使用GetWindow这个API);
2. 获取各窗口句柄的进程ID(使用GetWindowThreadProcessId这个API);
3. 在上述结果中查找进程ID,返回窗口句柄;
代码没有多少行,建议自己实现一下。 这个问题我解决了。。 dll同一段代码 为什么用不同的程序调用 找到的窗口句柄不一样呢。。。
用 delphi 就能调用dll 就能查找到窗口句柄 。如果用 sql server 调用dll 就查找不到窗口句柄。。
查帖子好像是说桌面的原因。。 应该建立管道进行通讯。。。是这样么?? 很久不用delphi了,也没有在sql server下调用DLL的经验。
如果是按照我的思路实现,而且DLL中的代码没有写错,调用的方式也没有错误,应该不会有不同的结果吧。
没能理解最后一段话,“建立管道进行通讯”?难道直接把参数传入DLL的导出函数,并获取结果不可以么? 的确出现这种情况了。。
function GetHWndByPID(const hPID: THandle): THandle;
type
PEnumInfo = ^TEnumInfo;
TEnumInfo = record
ProcessID: DWORD;
HWND: THandle;
end;
function EnumWindowsProc(Wnd: DWORD; var EI: TEnumInfo): Bool; stdcall;
var
PID: DWORD;
begin
GetWindowThreadProcessID(Wnd, @PID);
Result := (PID <> EI.ProcessID) or
(not IsWindowVisible(WND)) or
(not IsWindowEnabled(WND));
if not Result then begin EI.HWND := WND;
end;
end;
function FindMainWindow(PID: DWORD): DWORD;
var
EI: TEnumInfo;
begin
EI.ProcessID := PID;
EI.HWND := 0;
j:=inttostr(PID);
EnumWindows(@EnumWindowsProc, Integer(@EI)); //用来列举屏幕上所有顶层窗口。
//;showmessage(j);
Result := EI.HWND;
end;
begin
if hPID<>0 then begin
Result:=FindMainWindow(hPID);
end
else
Result:=0;
end;
function KillTask(ExeFileName: string): integer;{Uses Tlhelp32}
{const
PROCESS_TERMINATE=$0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
ProcessHwd:THandle;
begin
result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then
ProcessHwd := Integer(OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID));
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
result:=GetHWndByPID(ProcessHwd);
CloseHandle(FSnapshotHandle); }
var
ProcessName : string; //进程名
FSnapshotHandle:THandle; //进程快照句柄
FProcessEntry32:TProcessEntry32; //进程入口的结构体信息
ContinueLoop:BOOL;
MyHwnd:THandle;
begin
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //创建一个进程快照
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32); //得到系统中第一个进程
//循环例举
while ContinueLoop do
begin
ProcessName := FProcessEntry32.szExeFile;
if(ProcessName = ExeFileName) then begin
result:=GetHWndByPID(FProcessEntry32.th32ProcessID);
end;
ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
end;
CloseHandle(FSnapshotHandle); // 释放快照句柄
end;
delphi 的代码。。不同的编译器返回的结果不同!!!!! ?///???????? 期待delphi高手现身。 dll同一段代码 为什么用不同的程序调用 找到的窗口句柄不一样呢。。。
用 delphi 就能调用dll 就能查找到 ...
2843223 发表于 2010-1-14 16:16 http://bbs.antiy.cn/images/common/back.gif
sql server 与应用程序处于不同的session了,就会查找不到…… 可能是。。。一直没有查找到!!
页:
[1]