Q&A

  • [질문] 다른 윈도우 제어하기 관련...
몇가지 팁 및 질답글들을 찾아서 해보았지만 도무지 알수가 없어 이렇게 질문글 올립니다.
해야 할 일은 특정 프로그램의 윈도우 핸들을 얻고 그를 통해 그 윈도우에 원하는 키보드를 눌러주는 건데요.
윈도우 핸들을 얻는건 되구요.
키보드 송출이 되질 않네요.
아래와 같은 코드는 잘못된 건지요?  
신호를 받는 프로그램을 델파이로 만들어서 키보드 체크를 해보아도 감감 무소식입니다.
조언을 부탁합니다.

      PostMessage(wnd, WM_KEYDOWN, VK_DOWN, 0);
      sleep(30);
      PostMessage(wnd, WM_KEYUP, VK_DOWN, 0);

4  COMMENTS
  • Profile
    구창민 2009.04.28 00:35
    안녕하세요..
    전체 코드를 보지 못해서 뭐라 말씀을 드리기가 그러네요..
    코드는 잘못된게 없습니다만,
    위에 작성하신 wnd 는 어떤 윈도우의 핸들인가요?

    이해하는것은 직접 눈으로 확인하시는것이 가장 빠를것이므로,
    간단한 어플하나 만들어 보세요..

    1. TSpinEdit 를 폼위에 얹는다.
    2. TTimer를 폼 위에 얹는다
    3. 타이머 프로시저에 아래 코드를 작성한다.
    4. 실행한다.

    PostMessage(SpinEdit1.Handle, WM_KEYDOWN, VK_DOWN, 0);

    PostMessage(SpinEdit1.Handle, WM_KEYUP, VK_DOWN, 0);


    그럼 즐거운 프로그래밍 하세요..
  • Profile
    이남석 2009.04.28 21:07
    답변 갑사합니다.
    위에서 wnd는 외부 프로그램의 핸들입니다.
    예를 들면 파워포인트 슬라이드쇼 같은..
    먼저 SetForegroundWindow(wnd) 를 하고 나서 PostMessage 를 하면 실행이 됩니다.
    하지만 외부프로그램을 앞으로 띄우지 않고 할수 있는 방법은 없는가 하는 것입니다.
    예를 들면 투명한 메인 프로그램의 뒤로 외부 프로그램이 보일때 그에 대한 약간의 제어를 하고자 하는 것입니다.
    방법이 없을까요???
  • Profile
    구창민 2009.04.28 22:53
    코드를 보시면 아시겠지만, 저 메시지를 받아서 처리하는 윈도우는 특정 컨트롤의 핸들입니다.
    어떤 윈도우에 메지시를 보내는지 확실히 확인하셔야 할것 같습니다.
    이를테면..
    var
    wnd : HWND;
    begin
    wnd := FindWindow('TForm1', nil);
    PostMessage(wnd, WM_KEYDOWN, VK_DOWN, 0);
    PostMessage(wnd, WM_KEYUP, VK_DOWN, 0);

    이런 코드를 작성하고 Form1 에서 키다운 메시지가 발생할때 처리하는 특정 루틴을 만들면
    Form1 이라는 윈도우가 앞에있든 뒤에있든 그것은 문제가 되지않고 잘 처리가 됩니다..
    즉, 그 윈도우의 핸들을 제대로 얻어서 메시지를 던졌는지가 중요하겠네요

    그럼..즐거운 프로그래밍 하세요..
  • Profile
    이남석 2009.05.04 21:52
    좋은 말씀 감사합니다.
    메세지를 받는 윈도우의 핸들은 제대로 찾아집니다.
    실제로 실행되고 있는 윈도우들의 목록을 추출해서 그중에서 선택하도록 하고 있으니까요.
    근데 제가 메세지를 보내고자 하는 윈도우는 제가 만든것이 아니고 일반 응용프로그램입니다.
    물론 그 프로그램에서 사용하고 있는 핫키를 메세지로 보내는 것이지요.
    예를 들면 위에서 말씀드린 것처럼 파워포인트 슬라이스쇼 같은경우 상/하 방향키를 누르면 페이지간 이동이 되는데
    그를 메세지로 처리할 방법을 찾고자 하는 것입니다. 물론 SetForgroundWindow 를 한 후에는 반응을 하구요..
    하지만 그렇게 하지 않고 할수 있는 방법을 찾고 있습니다.
    부탁드립니다.