找回密码
 注册创意安天

问 老李 一个编程方面的问题

[复制链接]
发表于 2010-1-14 14:10 | 显示全部楼层 |阅读模式
知道进程 的 id  怎么 找到 窗口的句柄。。。
请给出代码。。。。最好是 C++的。。。
发表于 2010-1-14 14:59 | 显示全部楼层
老李和大家一起滑雪去了。
在我的印象里,并不是所有的进程都有窗口句柄的,但所有的窗口却都会有对应的进程。
所以,问题可以转化为:在已知的窗口句柄和进程ID对应表中,查找一个进程ID,若找到,则给出其窗口句柄。
那么方法就非常简单了:
1. 获取全部窗口句柄(使用GetWindow这个API);
2. 获取各窗口句柄的进程ID(使用GetWindowThreadProcessId这个API);
3. 在上述结果中查找进程ID,返回窗口句柄;

代码没有多少行,建议自己实现一下。
回复

使用道具 举报

 楼主| 发表于 2010-1-14 16:11 | 显示全部楼层
这个问题我解决了。。
回复

使用道具 举报

 楼主| 发表于 2010-1-14 16:16 | 显示全部楼层
dll同一段代码 为什么用不同的程序调用 找到的窗口句柄不一样呢。。。

用 delphi 就能调用dll 就能查找到窗口句柄 。如果用 sql server 调用dll 就查找不到窗口句柄。。

查帖子好像是说桌面的原因。。 应该建立管道进行通讯。。。是这样么??
回复

使用道具 举报

发表于 2010-1-15 01:52 | 显示全部楼层
很久不用delphi了,也没有在sql server下调用DLL的经验。
如果是按照我的思路实现,而且DLL中的代码没有写错,调用的方式也没有错误,应该不会有不同的结果吧。
没能理解最后一段话,“建立管道进行通讯”?难道直接把参数传入DLL的导出函数,并获取结果不可以么?
回复

使用道具 举报

 楼主| 发表于 2010-1-15 10:26 | 显示全部楼层
的确出现这种情况了。。
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 的代码。。不同的编译器返回的结果不同!!!!!
回复

使用道具 举报

 楼主| 发表于 2010-1-19 12:38 | 显示全部楼层
?///????????
回复

使用道具 举报

发表于 2010-1-19 12:52 | 显示全部楼层
期待delphi高手现身。
回复

使用道具 举报

发表于 2010-1-21 05:10 | 显示全部楼层
dll同一段代码 为什么用不同的程序调用 找到的窗口句柄不一样呢。。。

用 delphi 就能调用dll 就能查找到 ...
2843223 发表于 2010-1-14 16:16



    sql server 与应用程序处于不同的session了,就会查找不到……
回复

使用道具 举报

 楼主| 发表于 2010-2-27 10:25 | 显示全部楼层
可能是。。。  一直没有查找到!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册创意安天

本版积分规则

Archiver|手机版|小黑屋|创意安天 ( 京ICP备09068574,ICP证100468号。 )

GMT+8, 2024-12-22 15:06

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表