음. 이건 제가 거의 3시간 가까이 고생해서 찾은 소스이기도 하고
만든거이기도 해서 별로 알리고싶진 않았지만..(??)
그래도 저것을 넘는 더 많을 것을 이 까페로 부터 배웠기에 올려봅니다.
말은 저렇게 했지만 사실 제 소스가 아니구요
네이버 이재룡(liaeyong)님의 소스입니다.
뭐 저님도 퍼온거일지도 모르겠지만... 퍼왔다는 말이 없어서..
원본은 http://cafe.naver.com/pcnc/858
이구요 네이버에도 쥬스님이 퍼왔다고 하시면서 올려놓으신게 있습니다.
자세히 안봤지만 양이 조금 더 많은것 같긴 해요..
http://cafe.naver.com/myvb/26035 (ilovevb 네이버 까페입니다)
미니스파이의 경우 c로는 코드가 공개되어있고 또 vb로도 공개되어있는지 모르겠지만
검색으로는 못찾겠더라구요...
MSDN은 제가 설치를 안해서....
윗분님들의 소스를 토대로 제가 살을 조금 붙였습니다만..
----------------------이제 본론 --------------------------------------
모듈에 아래 내용을 추가합니다.
Public Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
'포인트가 있는곳의 핸들 구하기
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Type POINTAPI: X As Long: Y As Long: End Type
'마우스 좌표 구하기
Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
'클래스 구하기
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
'윈도우 타이틀 구하기
오 이건 제가 주석을 달아놨네요..ㅎㅎ
제가 적어놓은 주석은 앞에있는 코드를 설명하는 주석이라는 것을 명심하시고..ㅎ
(asdf
' 가나다 <-이건 제가 asdf를 설명해놓은거죠..
sdfsg )
우선 주석으로 위 코드의 설명은 됬다고 봅니다.
모듈에 넣어주세요!
자 그럼 이소스에 대해 설명하자면 항상위를 만들거나 할때는 findwindow로 클래스값이나 창이름을 알아서
그것으로 핸들값. 일종의 고유번호(프로그램을 킬때마다 바뀜)를 찾아내는 식이였지만
이번에는 핸들값을 먼저 알아내서 그 핸들값을 통해 클래스와 창이름을 알아내는 방식입니다.
그럼 먼저 폼에 만들어둘 준비물은
텍스트박스 3개, 커맨드버튼 1개,(대신 타이머를 해두셔도 됩니다.)
타이머 2개 그리고 코드창의 젤 위에
Private Declare Function GetAsynckeyState Lib "user32" Alias "GetAsyncKeyState" (ByVal vK As Long) As Integer
Dim aPoint As POINTAPI
Dim winhwnd As String
Dim sTitle As String
Dim cClass As String * 64
를 넣어주세요~^^
그럼 이제 시작해보겠습니다!
굳이 말하자면 text1은 윈도우 창 이름, text2는 클래스 이름
text3은 핸들값이 나오게 하겠습니다.
우선 타이머의 interval 속성을 모조리 1로 해주시구요(꼭 1로 할필요는 없습니다.)
첫번째 타이머에다가 아래 코드를 넣습니다.
GetCursorPos aPoint
X = aPoint.X
Y = aPoint.Y ' 마우스의 위치를 알아냅니다.
sTitle = Space(250) ' sTitle에 250이라는 빈공간을 만들어 둡니다.
hwnd = WindowFromPoint(X, Y) ' 마우스의 위치에 있는 핸들값을 구해 옵니다.
Text3.Text = winhwnd ' 텍스트 3에 핸들값을 저장합니다.
Call GetWindowText(winhwnd, sTitle, 250) ' 핸들값으로 윈도우 창이름을 알아옵니다
Text1.Text = sTitle ' 창이름을 텍스트1에 저장합니다
GetClassName winhwnd, cClass, Len(cClass) ' 핸들값으로 클래스를 알아옵니다.
Text2.Text = cClass ' 텍스트2에 클래스를 저장합니다
이까지만 해도 거의 다 했습니다. 그다음은 텍스트에 나온값을 복사하고 싶은데 계속 움직여서 복사가 불가능 합니다.
따라서 타이머 나머지 한개에 다음과 같이 넣어줍니다.
If (GetAsynckeyState(16) And GetAsynckeyState(17) And GetAsynckeyState(83)) Then ' 컨트롤 + 쉬프트 + S
Timer1.Enabled = False ' 탐색하던 타이머를 멈춘다
Command1.Enabled = True ' 다시가동 버튼을 사용할수 있게 한다
End If
타이머 이름이라든가 키버튼이라든가 그런건 알아서 바꿔 주시구요~
커맨드 버튼에다가(혹은 타이머)
아래 코드를 넣어주세요
Private Sub Command1_Click()
Timer1.Enabled = True
Command1.Enabled = False
End Sub
그리고 커맨드버튼은 enabled를 false로 해주세요.
text3의 visible값은 false!
(꼭 이렇게 하실 필요는 없어요..)
대충 다 이해하셨다고 믿구요 제가 뭘 빠트렸거나 그런게 있을수 있으니
소스파일을 올리겠습니다.
키누르는 것은 제 2번 팁에 있는거 아시죠..?
그리고 하나 팁을 더 드리자면
폼이름.hWnd 를 하시면 폼의 핸들값을 받아옵니다.
함수 = 폼이름.hWnd 요렇게 쓰면 되지요..
Mini Spy.zip
첫댓글 조회수는 제가 쓴글 중에 제일 높은데 댓글은 없네요... ㅠㅠㅠ
솔직히 말하자면... 보통 게임 만들때 GetAsyncKeyState를 많이 쓰죠...
흠... 이해는 잘안되는데... 노력하겠습니다!
흑.. 역시 아직 저의 말솜씨는 부족한가 보네요.. 제 경험에 가장큰 실력 향상법은 코드를 보고 분석해보는것 같습니다. 첨부파일이랑 제가쓴 글보고 한번 분석해보세요... ㅎㅎ
어렵다 ;; 나 아직 왕초보라 그런가>??
걍예제받아보세요.. 제가 글을 잘 못써서...
감사합니다
감사합니다
감사합니다
감사합니다
잘봣습니다
잘봣습니다