MS Windows API에서 edit 박스와 tab 이동키에 대한 질문입니다.

skylandi의 이미지

참고로 저는 CreateWindow를 이용하여 Edit박스를 만들었습니다.
첫번째 Edit 박스에 글을 입력 하고나서 tab키를 눌러 두번째 edit 박스로 이동 하는 방법을 알고 싶습니다.

옥정훈의 이미지

윈도우 서브클래싱을 이용하십시오.
원리에 대해 간단히 말씀드리면,
edit 컨트롤로 들어오는 모든 메시지를 후킹하는 방식입니다.
여기서 탭키 입력이 들어오면 포커스를 원하는 다른 컨트롤로 옮기면 됩니다.

관련 API 는,
SetWindowLong(), CallNextHookEx(), SetFocus()입니다.
MSDN을 참고하시면 충분합니다.

Necromancer의 이미지

윈도우 프로그래밍은 데브피아가서 물어보세요.

여기와는 성격이 전혀 안 어울릴 뿐만 아니라

잘못하면 다굴당할 수도 있습니다.

Written By the Black Knight of Destruction

purewell의 이미지

Quote:
윈도우 프로그래밍은 데브피아가서 물어보세요.

여기와는 성격이 전혀 안 어울릴 뿐만 아니라

잘못하면 다굴당할 수도 있습니다.

ㅡ_-);;; 정보공유에 있어서 너무 확실한 선을
그을 필요는 없다고 봅니다. 너무 확실한 선으로
오히려 인간의 사고가 제한될 수 있지 않을까요?

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

ddoman의 이미지

뭐...윗분의 말도 일리가 있지만..
최소한 커뮤니티의 성격에 어울리지않는 글을 올릴때는 최소한의 양해를 구하는
의사표시정도는 하는게 보기 좋다고 생각합니다만..

너무 확실한 선으로 정보공유를 제한한다는 측면도 이해는 갑니다만..
그걸 너무 당연시 여기면서 올리는건 문제가 있을듯..

그냥 양해의 덧글 정도 하나면 많은분들이 이해해주시고 넘어갈거 같습니다만.

질문올리신분처럼 너무 당당하게 질문올리는건 문제가 있는듯..

antibug의 이미지

물론 KLDP라는 이름이 있긴 하지만 그래도 엄연히 프로그래밍 QNA인데
이 질문이 커뮤니티의 성격에 어울리지 않다고는 보기 어려울 것 같은데요.
최소한의 양해라고 하는 것도 제목에 MS Windows API라고 타겟을 적었으면
어느정도 충분하지 않을까 생각되는데요...

아, 질문에 일단 답을 해야겠군요.
일단 CreateWindow()로 Edit 컨트롤을 생성했다고 하셨는데, 그 Edit
컨트롤의 Parent가 무엇인지 알 필요가 있겠군요. Dialog Box라면 별다른
처리 없이 다음 Edit 컨트롤로 포커스가 이동하니까요. 물론 그렇지 않기 때문에
질문을 했으리라고 봅니다만, 제 의도는 Parent가 굳이 Dialog가 아니어야 하는
이유가 없다면 그냥 Dialog를 사용하는게 좋다는 거죠. 어차피 Dialog도 보통의
윈도와 큰 차이가 없으니까요.

Dialog를 사용할 수 없는 이유가 있다면 그냥 일반적인 윈도를 사용해야 되는데
이럴땐 굳이 메시지 후킹까지도 필요없구요, subclassing을 사용하는 것이
일반적입니다. subclassing은 어떤 윈도의 윈도 프로시저를 대체하는 방식인
데요, 메시지 후킹보다 사용법도 쉽고 별로 고민할 것도 없습니다.

subclassing에 대해서는 Windows Developer's Guide 같은 책을 보면
잘 나와 있을 겁니다. (이책이 아니었나... 워낙 오래전 일이라서... -.-;; )
MSDN에서 subclassing 찾아봐도 나오니 쉽게 적용할 수 있을것 같네요.

--------------------------------------
재미없는 일은 하지 말자는 인간 쓰레기.
-.-;

옥정훈의 이미지

옥정훈 씀:

Quote:
윈도우 서브클래싱을 이용하십시오.
원리에 대해 간단히 말씀드리면,
edit 컨트롤로 들어오는 모든 메시지를 후킹하는 방식입니다.
여기서 탭키 입력이 들어오면 포커스를 원하는 다른 컨트롤로 옮기면 됩니다.

관련 API 는,
SetWindowLong(), CallNextHookEx(), SetFocus()입니다.
MSDN을 참고하시면 충분합니다.

antibug 씀:

Quote:
이럴땐 굳이 메시지 후킹까지도 필요없구요, subclassing을 사용하는 것이
일반적입니다. subclassing은 어떤 윈도의 윈도 프로시저를 대체하는 방식인
데요, 메시지 후킹보다 사용법도 쉽고 별로 고민할 것도 없습니다.

같은 내용이죠? 후후.
그리고 서브클래싱이 메시지 후킹입니다. ^^

antibug의 이미지

근데 서브클래싱이 곧 메시지 후킹이라는 얘기는 잘못된 것 같습니다.
메시지를 가로챈다는 의미로서 'Hook'을 사용하시고 계신지는 모르지만
WIN32에서 Hook이라는 기능을 별도로 제공하고 있는 이상은 subclass와
hook은 구분해서 사용해야 할 것 같군요.

subclass란 생성된 윈도의 프로시저를 다른 프로시저로 대체해서 시스템이
원래의 윈도 프로시저를 호출하지 않고 새로 설정한 프로시저를 호출하도록
하는 기법입니다. 이때문에 SetWindowLong()을 사용하죠.

하지만 hook은 (위에서 하는 작업을 포함해서) 더 많은 작업을 수행합니다.
그래서 제약사항도 좀 되고 처리해줘야 할 것도 좀 더 많습니다. Global
Hook 같은 경우에는 반드시 DLL에 있어야 한다거나, 대부분의 hook이
시스템 성능에 상당한(이라고는 하지만 현재 시스템에서는 뭐, 무의미하겠죠.)
오버헤드를 준다거나 하는 점들입니다.

hook이 WIN32에서 제공하는 기능이라면 subclass는 기능이라기보다는
일종의 해킹이라고 생각되는 군요. 그렇기 때문에 Developer's Guide에
처음 소개되었지 싶습니다.

--------------------------------------
재미없는 일은 하지 말자는 인간 쓰레기.
-.-;

옥정훈의 이미지

메시지를 가로채는 것을 메시지 후킹이라고 하는 것이 무리인지는 잘 모르겠습니다.
윈도우 서브클래싱에서 사용하게 되는 API의 이름이
CallNextHookEx()라는 것을 봐도 크게 무리는 아니지 싶습니다.

antibug 씀:

Quote:
근데 서브클래싱이 곧 메시지 후킹이라는 얘기는 잘못된 것 같습니다.
메시지를 가로챈다는 의미로서 'Hook'을 사용하시고 계신지는 모르지만
WIN32에서 Hook이라는 기능을 별도로 제공하고 있는 이상은 subclass와
hook은 구분해서 사용해야 할 것 같군요.

MSDN 어디에도 구분해서 사용해야 한다는 말은 없죠...
단지 antibug 님의 개인적인 생각 아니겠습니까.
저 역시도 위에 말씀드린 내용에 기반하여
제 개인적인 생각에 서브클래싱을 후킹이라고 생각하는 것 뿐입니다.
개인의 생각이 아닌 객관적인 근거가 없다면 이 논의는 접는 것이 좋을 듯 싶습니다.

다만...
제가 앞서 달았던 답변과 똑같은 내용을 쓰시면서
앞에 것 보다 이게 낫다라고 하셔서
다소 좀 당황했을 뿐입니다.

skylandi의 이미지

질문에 대한 답변 감사드립니다.

글구 여기 프로그래밍 Q&A 에 질문을 올린게 죄가 되면 죄송 하다고 하고 싶습니다.

그런데 Window API도 C로 만든 언어 이면서 프로그래밍이라고 생각이 듭니다. 데브피아나 WinApi에 가서 물어 봐도 되겟지만 저는 여기가 상당히 맘에 들고 이쪽으로만 하루에도 몇번씩 들락 날락 합니다. 아는 주제는 참여를 하지만 모르는게 아직 너무 많아서 답글도 잘 못 올립니다.

다음 부터 이곳에 리눅스 관련 언어에 대해 질문을 올리기로 하겟습니다.
나머지 분들 즐프 하세요~

프로그래밍 쪽의 아름다움은 기술을 공유하는 것이다.
프로그래머는 신이 내린 마지막 노가다이다.

내가 하고자 하는길....

markboy의 이미지

일단 subclassing과 hook은 다릅니다. :)

간단하게 subclassing과 hook이 message를 가로채서 처리 루틴을 바꿀 수 있다는 점에서는 비슷하지만 hook은 subclassing 과 달리 window를 필요로 하지 않습니다.

쉬운 예로 keyboard 메시지 처리를 바꾸고 싶을때 hook은 주어진 thread의 모든 window 의 keyboard 메시지 처리를 바꿀 수 있지만(한번에), subclassing은 오직 subclassed 된 window 에 대해서만 처리할 수 있습니다.

alsong의 이미지

Quote:
잘못하면 다굴당할 수도 있습니다.

아마도 리눅스 쓰라는 수천명의 다굴이가 있을지도 ^^;

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.