我通过一些工具知道QQ主窗体的类名为:#32770
我通过FindWindow('#32770',nil) 返回QQ主窗体的句柄为: 4063784
然后通过GetClassName(4063784,buf,40)返回类名:buf= #32770,按理来说是没错。
可是我通过工具查看QQ的句柄应为:131346
我再用GetClassName(131346,buf,40),返回类名:buf=也为#32770,
奇怪????
为何FindWindow回取来的句柄不是真正的句柄呢?谁能告诉我原因吗,分不够再加
我通过FindWindow('#32770',nil) 返回QQ主窗体的句柄为: 4063784
然后通过GetClassName(4063784,buf,40)返回类名:buf= #32770,按理来说是没错。
可是我通过工具查看QQ的句柄应为:131346
我再用GetClassName(131346,buf,40),返回类名:buf=也为#32770,
奇怪????
为何FindWindow回取来的句柄不是真正的句柄呢?谁能告诉我原因吗,分不够再加
我只有通过最笨的方法,用WindowfromPoint这个取得 的,(每次重启就要重新取,好麻烦)
还有别的好点的方法吗?
FindWindow()只能找到排在第一个的窗体~~
EnumWindows()遍历所以的窗体~~
根据GetClassName()、GetWindowText()来判断~~
在不就加上EnumChildWindows()来遍历子窗体,就能确定QQ的主窗体~~
function EnumChildProc(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
var
vBuffer: array[0..255] of Char;
begin
GetClassName(hwnd, vBuffer, SizeOf(vBuffer));
if SameText(vBuffer, 'Tencent_QQBar') then
PInteger(lParam)^ := hwnd;
Result := PInteger(lParam)^ = 0;
end;function EnumWindowsProc(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
var
vBuffer: array[0..255] of Char;
begin
GetClassName(hwnd, vBuffer, SizeOf(vBuffer));
if SameText(vBuffer, '#32770') then
EnumChildWindows(hwnd, @EnumChildProc, lParam);
if PInteger(lParam)^ <> 0 then PInteger(lParam)^ := hwnd;
Result := PInteger(lParam)^ = 0;
end;function WindowFromKeyWords: THandle;
begin
Result := 0;
EnumWindows(@EnumWindowsProc, Integer(@Result));
end;procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := IntToStr(WindowFromKeyWords);
end;
在北京还是??????????哪里?
但是我不知道如何来取得QQ的句柄/..呵