'BM_CLICK'에 해당되는 글 1건

  1. 2008/06/08 [Win32] 다른 윈도우에 버튼 클릭 메시지 보내기
2008/06/08 21:36


개인적으로 웹하드프로그램을 이용하는것이 있는데 유료로 할경우 파일 다운로드 속도도 고속이고 여러개파일이 자동으로 다운로드된다.

가입하고 유료패킷을 주더니 그거 다 사용하고 나니 무료로 바뀌었다.  무료라도 다운로드가 가능하지만 다운로드 속도가 최대 50KB/sec 이고 여러개 선택하더래도 자동으로 다운로드가 안된다.

한개가 다운로드 끝나고 나면 다운로드 버튼을 눌러줘야하는 단점이있다.

첫번째 속도야 학교 컴퓨터에 걸어놓으면 상관없지만 문제는 매번 다운로드 버튼을 눌러줘야 하는점이 문제가 걸렸다.




그래서 생각해낸 꽁수~!! 해당 다운로드 윈도우로 버튼클릭 메시지를 계속 보내는 방법~!!


당장 실행에 착수~!! 메시지를 보내는 방법은 간단한데...

1. 메시지를 보낼 윈도우 핸들을 찾는다.

2. 클릭 메시지를 보낸다


윈도우 핸들을 찾는건 FindWindow WIN32 API를 이용하면 되는데 문제가 있다.
버튼클릭 메시지를 보낼려는 윈도우 캡션이 고정이 아니라는 점이다.
그래서 FindWindow로 하지 않고 모든 윈도우 핸들을 반환하는 EnumWindow를 이용해 얻어온후 캡션을 비교해서 찾는다.

EnumWindows는 모든 윈도우 핸들을 반환하고 콜백함수를 통해 처리되는데 그 콜백함수에서 원하는 캡션을 찾으면된다.

MSDN의 EnumWindows 내용

BOOL EnumWindows(
  WNDENUMPROC lpEnumFunc,
  LPARAM lParam
);


lpEnumFunc


[in] Long pointer to an application-defined callback function

lParam
[in, out] Specifies an application-defined value to be passed to the callback function.

이렇게 해당 윈도우 핸들을 찾으면 버튼의 핸들을 찾아야 하는데 이것은 EnumWindows로 찾은 윈도우의 차일드윈도우기 때문에 FindWindowsEx Win32 API 를 이용한다.

이렇게 버튼의 핸들까지 찾으면 SendMessage를 이용해 클릭 메시지를 보내면 되는데 버튼 클릭 메시지가 뭐지?

처음에는 WM_COMMAND줄 알고 있었는데 아무리 해도 버튼클릭이 안되는거였다.

한참을 구글링을 한결과 버튼 클릭 이벤트는 BM_CLICK 다.

::SendMessage(hwndbutton,BM_CLICK,0,0)

이렇게 보내니 결국 성공~!!


이제 타이머를 이용해서 주기적으로 보내니 문제가 발생했다. 어쩐지 문제 없이 잘 된다싶었다.

해당버튼이 비활성화된 상태에서 클릭메시지를 보내는것이 잘못이었다.

그렇다면 해당버튼의 윈도우 속성을 얻어오는것이 있을텐데...

다시 구글링~!!(난 구글 없으면 어떻게 프로그래밍 할지 대책이 안선다. ㅠㅠ)

그래서 찾어낸 API가 GetWindowLong라는 API다. 이 API는 파라미터로 핸들하고 GWL_STYLE를 설정하면 해당윈도우의 윈도우 스타일을 반환한다.

비활성일경우에는 스타일에 WS_DISABLED 이 스타일이 포함되어있을테니깐 LONG변수를 만들어서 기본 윈도우 스타일과 WS_DISABLED 스타일 추가해놓고 GetWindowLong API로 반환한 스타일과 비교하면 끝~!!



Posted by 세라피안

트랙백 주소 - http://serapian.pe.kr/trackback/173 관련글 쓰기

댓글을 달아 주세요