아래와 같은 함수를 이용하여 화면상에 떠 있는 윈도우의 핸들을 얻었습니다..
물론 그 핸들을 이용해 getwindowrect에 파라메터로 핸들과 Rect구제체를 집어넣고 rect.left로 좌표값을 얻으니 값이 얻어지지 않습니다. 값은 나오는데 좌표값을 벗어나는 값을 내뱉고 있습니다... 뭐가 잘못된건가요.. - 아래에서 얻어진 핸들값은 제대로 된 핸들값입니다. -
function EnumWindowsProc(wnd : HWND; lpr : integer):Boolean; stdcall;
begin
if IsWindowVisible(Wnd) and ((GetWindowLong(Wnd, GWL_HWNDPARENT) = 0) or(HWND(GetWindowLong(Wnd, GWL_HWNDPARENT)) = GetDesktopWindow)) and
((GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW) = 0) then
begin
hdles[hdi] := GetWindowLong(wnd, GWL_HINSTANCE);
inc(hdi);
end;
end;
hdles는 전역으로 배열을 선언해놓았습니다. 그리고 hdi도 전역변수로 선언되어 있습니다.
getwindowrect(hdles[i],RECT)로 적어놓고 윈도우 좌표값을 '뱉어'라고 했는데.. 엉둥한 말만 내놓고 있네요..
음.. 좀 이상하네요..
핸들이 정확하다면 다르게 나올 이유가 없을것 같은데.. 혹시 다른데 문제가 있는것
아닌까요.???
예전에 제가 다른프로그램의 좌표를 구한적이 있어서 약간 수정해서 올려 드릴께요..
테스트 해봤는데 잘되는데???.. 좀 이상하네요...
이거 한번 해보시고 그래도 안돼면.. 다시 올려 주세요.. 그럼...
procedure TForm1.Button1Click(Sender: TObject);
var
WinHandle : THandle;
fRect : TRect;
begin
winHandle := FindWindow('CabinetWClass',nil);
if WinHandle <= 0 then
WinHandle := FindWindow('IEFrame',nil);
if Winhandle <= 0 then
begin
ShowMessage('IE가 실행되지 않았습니다');
Exit;
end;
if getWindowRect(WinHandle, fRect) then
begin
showmessage(IntToStr(fRect.Left) + ' ' +
IntToStr(fRect.Top) + ' ' +
IntToStr(fRect.Right) + ' ' +
IntToStr(fRect.Bottom) );
end else begin
ShowMessage('좌표를 구할수 없습니다.');
end;
end;
물론 이건 테스트로 만든거고 폼에 버튼하나밖에 없습니다..
그럼.. 즐거운시간 되세요..
- 하얀까마귀 -