로그를 보니 이글에 대한 검색이 많더군요.
그래서 기존의 VB(비베)에 C++ 관련 정보도 추가해보았습니다.

------------------------------------------------------------

오늘 이것때문에 시간을 너무 많이 소비하였다.
사실 알고보면 이것때문에 오히려 개발시간이 단축된건 사실이다.
인터넷 요기조기를 돌아보고 삽질을 한결과 알아낸 사실 몇가지를 기록하겠습니다.

일단 findwindow 가 머냐면...
여러가지 용도로 쓰겠지만
제가 사용한 목적은 특정 프로그램이 실행중인가를 알아내기 위해서입니다.
가령 B 라는 프로그램이 실행중인지 아닌지 A라는 프로그램이 알아내기 위해서입니다.
이것또한 자세히 들어가보면 저는 한프로그램에서 (VB) shell 명령어로
두 프로그램을 실행시키는데 순차적으로 실행이 되어야됩니다.

나중에 해당기능이 완성되면 별도의 글로 정리를 하겠지만
카트라이더 처럼 런처를 만들려고 합니다.
일단 프로그램이 설치되어있는가 확인후 만일 없거나 버젼이 다른경우
설치프로그램을 다운로드하고 설치를 한후에
프로그램을 실행시키는 방식입니다.

서론이 넘길었군요.
머 아는것도 별로 없는게 말만 많았습니다.

일단 vb에서 findwindow를 사용하기 위해서는 API를 선언해야합니다.



Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

그리고 해당 프로그램의 class 명이나 caption 값을 알아야하는데
어떻게 하느냐면. caption는 의외로 간단합니다.
프로그램을 실행시키면 가장상단에 있는것 있죠?
브라우져를 예로 들면 <title>...</title> 부분입니다.
그런데 class 명을 알고 싶거나 caption 값이 이상하게 안된다? 하면
C++ 를 깔면 같이 깔리는 spy++ 이라는 프로그램을 실행시킨후에
Ctrl + F 를 누른후 + 라로 마치 과녁같이 생긴것을 해당프로그램에
드래그 드롭을 하면 관련정보가 주르륵 나옵니다.

여기서....

제가 가장 시간을 잡아먹은 부분입니다.

Dim lngHwnd As Long '프로세스 확인

Private Sub Form_load()
  lngHwnd = FindWindow(vbNullString, "Sample App")
  'MsgBox lngHwnd
  If lngHwnd = 0 Then
  Timer1.Enabled = False
  executeFcs
  Else
  chkInstall
  End If
End Sub

위에 코드중에서 이부분

lngHwnd = FindWindow(vbNullString, "Sample App")

첫번째인자가 Class명입니다.
두번째인자가 caption값이구요...

class 명을 모르면 vbNullString 이런식으로 넣으면 되구요
반대인경우에는 caption 값에 vbNullString 를 넣는 식으로
하시면 됩니다.

정상적으로 다른 프로그램이 실행중이면 Hwnd 값이 나오고
실행중이 아니면 0 이 반환됩니다.

그런데 왜 시간을 소비했냐면 물론 전제적으로 프로그램이 잘안되서
이것저것 만지다보니 이렇게도 해보고 저렇게도 해보다가
코드가 뒤죽박죽....머이런 식이었습니다.

C++ 에서는

HWND hWnd;

hWnd = FindWindow( NULL,"Sample App");
위의 설명과 똑같이
첫번째 인자는 클래스이름이고
두번째 인자는 윈도우이름입니다(caption).

if(hWnd)
{
    SetForegroundWindow((HWND)(((DWORD)hWnd) | 0x01));
    return 0;
}

위에 코드는 클래스이름 또는 윈도우 제목이 일치하는 윈도우를 찻았다면
SetForegroundWindow 함수를 사용하여 그 윈도우가 활성 윈도우가 되게 하는 코드입니다.

그럼....오늘도 행복한 프로그래밍 하세요.
저도 행복한 프로그래밍을 하도록 노력하겠습니다.^^;
Posted by 빨강토끼
,