API(Apllication Programming Interface)
API 함수란 Apllication Programming Interface 의 준말로 윈도우가 사용하
는 시스템 함수 라이브러리입니다.
윈도우 프로그래밍에서는 윈도우를 만든 MS 사의 프로그래머들이 미리 만들
어 놓은 함수들로 하부 모듈부터 만들 필요 없이 그냥 가져다 쓰면 되기 때문에
프로그래밍이 아주 쉬워졌습니다.
예를 들어 드라이브의 용량을 구하는 프로그램을 작성하시려 하면 실제로는
하드디스크 제어와 여러 제반 지식을 알고 있어야 되는데 비해 윈도우 프로그래
밍은 그것을 마치 블랙 박스처럼 만들어서 필요한 인수들만 넣으면 원하는 결과
를 리턴 하게 되어 있습니다.
흔히 쓰는 비주얼 베이직 함수 예를 들어 Left, Len 등의 문법도 모두 API 와
같은 함수이며 단지 다른 것은 비주얼 베이직 함수는 내부 함수이고 API 함수는
외부 함수라 할 수 있지만 궁극적으로는 똑같습니다. 따라서 복잡하게 생각할 필
요는 전혀 없는 것입니다.
API 함수는 지극히 문법적(사전을 익히는 것과 비슷하다 여기면 됩니다.)이며
약간 지루한 감도 적지 않게 느낄 것입니다.
API 함수를 익히면 비주얼 베이직에서 할 수 없는 일들을 아주 다양하게 할 수
있으니 API 함수는 비주얼 베이직 고급 프로그래밍을 구현하기 위해서 반드시 거
쳐야 할 필수 관문이라 할 수 있습니다.
API 뷰어는 아래의 사진 경로에 있습니다.
우선 먼저.. FindWindow API, SendMessage API 많이 낯설진않죠?
이 두 API 함수를 이용해 간단히 윈도우를 강제로 종료시켜볼것입니다
FindWindow API 는 이런식으로 사용이됩니다
Dim hWnd As Long
hWnd = FindWindow( ClassName, WindowName )
※
ClassName 은 그 해당 윈도우의 클래스네임이고요,
WindowName 은 그 해당 윈도우의 타이틀입니다.
hWnd 는 왜 해놨냐.. 핸들값을알아야만이 SendMessage API 를 통해
그 핸들을 찾아 메세지를보내서, 창을 종료시킬수가있거든요.
그리고 SendMessage 는 이런식으로 사용됩니다.
ClassName 을 사용할경우 WindowName 을 vbNullString 으로,
WindowName 을 사용할경우 ClassName 을 vbNullString 으로,
또는 둘다 알아서 둘다 써도 큰 무리는 없습니다.
Call SendMessage( hWnd, wMsg, wParam, lParam )
hWnd, wMsg 쪽이 필요있고 저 뒤에 wParam, IParam 은 별로 큰지장이
되진 않습니다. hWnd 은 저 FindWindow 로 찾은 hWnd 값이 되겠고요..
wMsg 는 윈도우메시지입니다. 창종료때 사용하는 상수는
WM_CLOSE
WM_QUIT
WM_DESTROY
WM_NCDESTROY
대표적으로 이 4개가 있습니다만, 다 사용하진않고요 메모장을 대상으로..
WM_QUIT 과 WM_CLOSE 만 사용하겠습니다.
일단 예를 들어줄께요, 나머지는 독자분이 알아서 해결하실수 있으리라 믿어요^^.
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_QUIT = &H12
Private Const WM_CLOSE = &H10
Private Sub Command1_Click()
Dim hWnd As Long
hWnd = FindWindow("Noteped", vbNullString)
'// 예외를 위한 처리( 메모장이 켜져있지 않을경우 )
if hWnd = 0 Then MsgBox "메모장이 켜져있지 않습니다." : Exit Sub
Call SendMessage(hWnd, WM_QUIT, 0, 0)
Call SendMessage(hWnd, WM_CLOSE, 0, 0)
End Sub