|
답변해주신 장성호님 정말 감사합니다 :) 여러모로 도움이 많이 되엇는데요...
윈도우의 기본 화상키보드를 보면, 화상키보드 창 자체는 비활성인데도 불구하고, 활성화된 창에 키입력이 가능합니다. 그렇다고 화상키보드안의 버튼을 눌러도 화상키보드창이 활성화되진 않더군요... 이럴때 후킹을 해야하는건가요?
지금 제가 다시 만든건 제목표시줄이 현란하게 변한답니다[버튼을 여러번 누르면...]
게다가 몇번에 한번꼴로 키입력이 안되는듯도 했구요... 후킹쪽은 한번도 안해본지라...-_-;;
한번 찾아보았습니다만... 다 VC관련이라 힘들더군요;ㅅ ;[제가 검색능력이 딸린가봅니다.]
후킹을 안하고 하는 방법이 있는지 궁금합니다 :)
아 그리고, 제가 한것이 제대로 동작은 하는데 아까 말한 그런 문제가 있어서, 일단 소스좀 보여드려야 할 것 같아서요 :)
//---------------------------------------------------------------------------
// Interval = 1
// 프로그램실행할때부터 true
// g_Hwnd가 전역 선언
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
HWND hWnd;
hWnd = ::GetFocus();
if((!hWnd))
{
g_Hwnd = GetForegroundWindow();
}
}
//---------------------------------------------------------------------------
// 검색하다보니 일반 버튼은 화상키보드에서 안쓰는게 좋다고 하더군요...
void __fastcall TForm1::Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
SetActiveWindow(g_Hwnd);
SetForegroundWindow(g_Hwnd);
keybd_event(VkKeyScan('q'), 0, 0, 0);
keybd_event(VkKeyScan('q'), 0, KEYEVENTF_KEYUP, 0);
}
//---------------------------------------------------------------------------
아 그리고 원래 질문했던 글에서 질문했던걸 놓친듯하여...
keybd_event(VkKeyScan('q'), 0, 0, 0); 여기에서 VkKeyScan()이라는 것을 쓰는데요...
keybd_event(VkKeyScan('ㅂ'), 0, 0, 0); 이런식으로 한글을 넣으면 어떻게되나요;ㅅ ; 제대로 확인할 길이 없어서요...
[이 질문을 하는 이유가 VK_HANGUL 이 한/영 둘다 토글을 책임지는지에 대한 질문과 관련있겠네요 :)]
다시한번 답변 기다리고 있을게요 ㅠㅠ
장성호 님이 쓰신 글 :
: 첫째로
: GetForegroundWindow 에 문제가 있습니다.
: 왜냐하면 저함수를 쓰면 화상키보드 프로그램의 핸들을 가져올것이니까요
: 화상 키보드 프로그램안에서 GetNextWindow함수로 입력창을 아무리 찾아봐야 소용없겠죠
:
:
: 둘째
: SetAvtveWindow() 함수는 윈도우 가져오기 함수가 아닙니다.
: 이미 알고있는 윈도우의 HWND를 줘서 그 윈도우가 Avtive되도록 하는 함수입니다.
:
:
: 셋째
: SetFocus API를 Builder에서 사용하는데 전혀 문제없습니다.
:
: 단 VCL에서 TWinControl에 SetFocus함수가 있으므로 Namespace를 구분해줘야 합니다.
:
: VCL 함수 원형 ==> void TWinControl::SetFocus();
: API ==> void * SetFocus(void *);
:
: HWND TargetHwnd;
: ::SetFocus(TargetHwnd); // 이렇게 쓰시면 됩니다.
:
:
: [추신]
: 윈도우 보조프로그램에 있는 화상키보드 프로그램을 여러번 실행해서 테스트 해보시면서
: 메카니즘을 분석해보십시요
:
: 1.화상키보드 프로그램이 Caption에 마우스 Down된 상태가 아닐때는
: 키보드 프로그램이 Active되어있지 않습니다.
: Caption에서 Muouse Up하는 순간 이전에 Active되어있던 윈도우가 active되고 있죠
:
:
: 2.두번째로 키보드 프로그램을 띄워두고 다른곳에서 타이핑해보세요
: 다른곳에서 타이핑 하는데 화상 키보드 프로그램의 Key가 바뀌고 합니다.
: Shift 나 CapsLock 등을 눌러보십시요
:
: ==> 즉 화상키보드 프로그램이 후킹을 이용한다는 것을 알수 있을것 같습니다.
: 반드시 후킹을 이용해야 하는가? 뭐 아닐수도 있겟습니다만 .... 그게 일반적인 방법같습니다.
:
:
:
:
:
: 온새미 님이 쓰신 글 :
: : 안녕하세요, 온새미입니다... 항상 여기에서 도움만 받고 온 온새미군인데 또 구원의 손길을 받고자 질문을 올립니다...
: :
: : 제가 지금 질문할 내용은 크게 두가지로 말할 수 있는데,
: :
: : 'SetActiveWindow()를 이용한 윈도우 가져오기가 안되는데...[아래 소스에 내용이 :)]'
: : 'keybd_event(VkKeyScan('ㅁ'), 0, 0, 0); 이런 형식이 되는지...'
: :
: : 이렇답니다... 자, 본격적으로 질문하도록 하겠습니다 :)
: :
: : 일단 첫번째 질문에 관한 것인데요, 제가 친구의 도움을 받아서 윈도우의 화상키보드다음의 순서 즉 Z순서상 화상키보드 다음 순서의 창[프로세스]을 잡아서 거기다가 keybd_event로 입력을 때려넣어서 실제 키보드에서 입력하듯이 하고 싶은데요... 아래에 소스를 좀 봐주세요...
: :
: : // Button q를 눌렀을때 발생하는 이벤트입니다. ////////////////////////////////////////////////
: : void __fastcall TForm5::Button15Click(TObject *Sender)
: : {
: : HWND hwndFirst = ::GetForegroundWindow();
: : HWND hwndNext;
: : DWORD dwProcessID;
: : char szTextWnd[128];
: : do{
: : GetWindowThreadProcessId(hwndFirst, &dwProcessID);
: : //Process의 ID를 가지고 온다.
: : if(IsWindowVisible(hwndFirst)){
: : GetWindowText(hwndFirst, szTextWnd, 128);
: : // 윈도우의 Text를 가지고 온다.
: : if(GetCurrentProcessId() != dwProcessID){
: : if(szTextWnd[0] != 0){
: : SetActiveWindow(hwndFirst); // 이부분이 윈도우를 따오는 부분인듯...
: : keybd_event(VkKeyScan('q'), 0, 0, 0);
: : keybd_event(VkKeyScan('q'), 0, KEYEVENTF_KEYUP, 0);
: :
: : // MessageBox(NULL,szTextWnd,"dd",64);
: : break;
: : }
: : }
: : }
: :
: : hwndNext = hwndFirst;
: : hwndFirst = GetNextWindow(hwndNext, GW_HWNDNEXT);
: : // 다음 순위의 window를 가지고 온다.
: : }while(hwndFirst);
: : }
: : //////////////////////////////////////////////////////////////////////////////////////////////
: :
: : SetActiveWindow가 핸들을 가져와서 해당 핸들은 Active상태로 만드는 것이 맞다면, 정상적으로 동작해야할텐데... 그게 안되네요...; 그래서 제 친구가 SetFocus라는 함수로 추천했습니다만, 빌더에서는 지원하지 않는 모양입니다...
: : 제가 생각하는 궁극적인 목표는, Windows에서 기본으로 지원하는 화상키보드정도의 기능을 갖춘[뭐 기본적인 키입력기능입니다만...] 것을 만드는 것입니다. 제가 따로 만드는 이유가 윈도우의 화상키보드는 버튼크기가 너무 작기때문에, 제가 적용하려는 프로그램에는 좀 어려운 감도 있어서 말입니다...
: :
: :
: : 자, 두번째 질문 들어갑니다... 위에서 거의 반은 말했지만요... :)
: : keybd_event라는 함수를 화상키보드에서 쓰고있는데요, 키보드의 직접입력과 같은 기능이 있어서 쓰고 있었는데, 기존의 화상키보드에는 한/영키가 없어서 Virtual Key쪽을 뒤져보니, VK_HANGUL이라는 한글 IME 변환키가 있더군요 :) 그래서 가져다 쓰려는데... 문제는, 현재 IME상태가 한글인지, 영어인지 구별하여 만약 한글이면 화상키보드자판은 한글자판으로바꿔주고, 영어면 영어자판으로 바꿔주려고 합니다. 제가 워낙 비주얼한 쪽을 좋아해서리;ㅅ ;
: : 좀 질문에서 벗어난 느낌이 드는데 이어서 계속하자면, keybd_event(VK_HANGUL, 0, 0, 0);을 쓰게되면 영어인 상태에서는 한글로 바뀌겠으나 한글상태에서 쓰게되면 어떻게 되는지 궁금합니다...
: : 이번엔 진짜 메인질문인데요... 방금 질문했던것이 안되면, keybd_event(VkKeyScan('ㅁ'), 0, 0, 0); 이런형식으로 써야할텐데... 이것이 가능한가요? 궁금해서 몸이 비틀어질거같습니다...
: :
: : 시간이 갈 수록 마음이 조급해지네요 ㅠㅠ 빠르고 친절한 답변 기다리고 있겠습니다 :)
: : 긴글 봐주셔서 감사합니다~
|