2843223 发表于 2010-1-14 14:10

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

知道进程 的 id怎么 找到 窗口的句柄。。。
请给出代码。。。。最好是 C++的。。。

swordlea 发表于 2010-1-14 14:59

老李和大家一起滑雪去了。
在我的印象里,并不是所有的进程都有窗口句柄的,但所有的窗口却都会有对应的进程。
所以,问题可以转化为:在已知的窗口句柄和进程ID对应表中,查找一个进程ID,若找到,则给出其窗口句柄。
那么方法就非常简单了:
1. 获取全部窗口句柄(使用GetWindow这个API);
2. 获取各窗口句柄的进程ID(使用GetWindowThreadProcessId这个API);
3. 在上述结果中查找进程ID,返回窗口句柄;

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

2843223 发表于 2010-1-14 16:11

这个问题我解决了。。

2843223 发表于 2010-1-14 16:16

dll同一段代码 为什么用不同的程序调用 找到的窗口句柄不一样呢。。。

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

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

swordlea 发表于 2010-1-15 01:52

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

2843223 发表于 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 的代码。。不同的编译器返回的结果不同!!!!!

2843223 发表于 2010-1-19 12:38

?///????????

swordlea 发表于 2010-1-19 12:52

期待delphi高手现身。

liveck 发表于 2010-1-21 05:10

dll同一段代码 为什么用不同的程序调用 找到的窗口句柄不一样呢。。。

用 delphi 就能调用dll 就能查找到 ...
2843223 发表于 2010-1-14 16:16 http://bbs.antiy.cn/images/common/back.gif


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

2843223 发表于 2010-2-27 10:25

可能是。。。一直没有查找到!!
页: [1]
查看完整版本: 问 老李 一个编程方面的问题