사진기도 없고 해서 텍스트로 그림을 그렸습니다.

 터치 패널쪽
| # # # #|
| # # # #|
| # # # #|
| | | | | |
  1 2 3 4
 터치 컨트롤러 쪽

4 선식 터치 패널쪽에서 나오는 신호 순서는 아래와 같습니다.

 1 : Y축- (Top)
 2 : X축+ (Right)
 3 : Y축+ (Bottom)
 4 : X축- (Left)

터치 컨트롤러가 내장된 산업용 메인보드를 사용하실 때 참고하시면 유용합니다.
이올린에 북마크하기
2009/10/21 18:31 2009/10/21 18:31
Posted by TylorSTYLE™
델파이로 갈구리질을 하려면 꼭 봐야 하는 강좌(검색해도 이게 제일 확실하고 잘 설명된 자료이다.)가 있습니다.

바로 델파이 고수 중 한분이신 민성기님께서 다가오는 21 세기를 바라보며 쓰신 주옥같은 델파이 후킹 강좌입니다.

지금은 델파이 코리아가 문을 닫고 델마당 강좌란에 퍼온 자료가 남아있어(여러 블로그에서 펌질이 되어 검색하면 다 같은 글이 나올겁니다.) 링크를 겁니다.

민성기도 하는 후킹 3화 링크 : http://www.delmadang.com/community/bbs_view.asp?bbsNo=3&bbsCat=42&indx=196917

이 강좌에서 한가지... 운 없으면(컴파일러가 삽질할 경우) 문제가 생길 수 있는 코드를 정정하고자 합니다.
{ 셀 갈구리질 }
function MyShellHook(Code : Integer; wParam : WPARAM; lParam : LPARAM) : LongInt; stdcall;
var
  Buff : array [0..255] of Char;
  s : String;
begin
  { 파일에 저장된 훅핸들을 읽어온다. }
  if HShellHook = 0 then
    ReadData;

  { 윈도우의 생성과 소멸만 괴롭힌다. 자세한 내용은 도움말을 참조할 것. }
  if (code = HSHELL_WINDOWCREATED) or (code = HSHELL_WINDOWDESTROYED) then
  begin
    { 윈도우의 클래스명을 읽어온다. Code값이 위의 두개의 값일 경우, wParam은 윈도우의 핸들값이 된다. }
    GetClassName(wParam, Buff, SizeOf(Buff));

    { 클래스명이 노트패드라면 메시지박스 보여주기. }

    if Buff = 'Notepad' then
    begin
      if (code = HSHELL_WINDOWCREATED) then
        S := '메모장이 실행되는구만요~!'
      else
        S := '메모장이 끝났구만요~!';
      MessageBox(0,PChar(S),'Hook Message',0);
    end;
end;
{ 다음 훅체인 호출 }
Result := CallNextHookEx(HShellHook, Code, wParam, lParam);
end;

제가 작성했던 코드에서는 이전 포스트의 프로세스 아이디로 윈도우 핸들을 얻는 코드를 통해 윈도우 핸들은 얻은 뒤 후킹 DLL 로 핸들 값을 넘겨 위 코드를 이용해 해당 프로그램이 죽는지 사는지 감시하도록 했습니다. (아래 코드 첨부)

function MyShellHook(Code : Integer; wParam : WPARAM; lParam : LPARAM) : LongInt; stdcall;
var
  Buff : array [0..255] of Char;
  clsName : array [0..255] of Char;
begin
  if HookData.ApplicationHandle = 0 then // HookData.ApplicationHandle 은 제가 만든 훅 핸들 보관용 구조체입니다.
    ReadData;

  if (code = HSHELL_WINDOWCREATED) or (code = HSHELL_WINDOWDESTROYED) then
  begin
    GetClassName(wParam, Buff, SizeOf(Buff));
    GetClassName(HookData.hApp, clsName, SizeOf(clsName)); // HookData.hApp 에는 감시할 프로그램의 핸들이 들어있습니다.

    if strPAS(Buff) = strPAS(clsName) then
    begin
      if (code = HSHELL_WINDOWCREATED) then
      begin
        SendMessage(HookData.ShellHandle, WM_USER + 4, 0, 1);
      end else
      begin
        SendMessage(HookData.ShellHandle, WM_USER + 4, 0, 0);
      end;
    end;
  end;
  { 다음 훅체인 호출 }
  Result := CallNextHookEx(HookData.ApplicationHandle, Code, wParam, lParam);
end;


 이 코드에서는 클래스명 비교부분에 strPAS 함수를 사용하여 비교하도록 하였습니다.
 민성기님 코드의 경우 비교문 우측에 'Notepad' 라는 String 문자열이 있어 좌측 Char 배열을 컴파일러가 비교를 위해 자동 형변환을 하도록 했지만 위 코드에서는 비교문 양쪽 모두 Char 배열이 되어 문자열로 비교하지 않게 됩니다.
 strPAS를 통해 String 으로 변환하여 비교하면 문제없이 처리가 됩니다.

이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/10/20 18:53 2009/10/20 18:53
Posted by TylorSTYLE™


 최근 개인적으로 이것 저것 신경쓸 것 도 많고, 바쁘기도 해서, TSGMapsGPS 마무리 작업도 몇 개월 째 진행도 못하고 블로그는 방치 상태입니다. 흐헝흐흥 ㅠ.ㅠ

 블로그의 정전을 깨기 위해 오랜만에 작업하면서 정리한(?) 코드를 올립니다.

 이 코드는 볼랜드 포럼의 '프로세스 아이디로 윈도우 핸들 얻기' 라는 글의(아래 링크) C 코드를 Delphi 용으로 조금 변형한 코드입니다.
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=895

함수 소개 :
 실행 파일의 경로를 인자로 함수를 호출하면 실행파일 실행 후 리턴값으로 실행된 파일의 Window Handle 을 반환합니다.

Function TForm1.ApplicationStart(ApplicationPath : String) : THandle;
  // 함수 내 내부 함수.
  function GetWinHandle(pid : Cardinal): THandle; // 프로세스 아이디로 윈도우 핸들 얻기
  var
    tempHwnd : THandle;
    idProc : Cardinal;
  begin
    result := 0;

    tempHwnd := FindWindow(NIL, NIL); // 최상위 윈도우 핸들 찾기

    while( tempHwnd <> 0 ) do
    begin
      if( GetParent(tempHwnd) = 0 ) then // 최상위 핸들인지 체크, 버튼 등도 핸들을 가질 수 있으므로 무시하기 위해
      begin

        GetWindowThreadProcessId( tempHwnd, idProc );

        //if( pid = ProcIDFromWnd(tempHwnd) ) then
        if (pid = idProc) then
        begin
          result := tempHwnd;
          break;
        end;
      end;
      tempHwnd := GetWindow(tempHwnd, GW_HWNDNEXT); // 다음 윈도우 핸들 찾기
    end;

  end;

var
  SInfo: TStartupInfo;
  PInfo: TProcessInformation;
begin
  Result := 0;

  if (ApplicationPath <> '') then
  begin
    if not FileExists(ApplicationPath) then // 파일의 존재 여부 확인.
    begin
      exit;
    end;
  end;

  FillChar(SInfo, SizeOf(SInfo), 0);
  SInfo.cb := SizeOf(SInfo);
  if CreateProcess(nil, PChar(ApplicationPath), nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, SInfo, PInfo) then // 프로그램 실행.
  begin
    CloseHandle(PInfo.hThread);
    WaitForInputIdle(PInfo.hProcess, INFINITE);
    Result := GetWinHandle(PInfo.dwProcessId);
    CloseHandle(PInfo.hProcess);

  end;
end;

이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/10/19 11:08 2009/10/19 11:08
Posted by TylorSTYLE™

BLOG main image

카테고리

전체 (144)
Freeware (3)
Embedded (27)
신변잡기 (51)
디지털 회로 (2)
Programming (20)
무선 네트워크 (15)
Computer (18)
사용기 (7)

글 보관함

262

179

-35 days

today : 93

Daum 블로거뉴스
믹시