|
안녕하세요, 온새미입니다... 항상 여기에서 도움만 받고 온 온새미군인데 또 구원의 손길을 받고자 질문을 올립니다...
제가 지금 질문할 내용은 크게 두가지로 말할 수 있는데,
'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); 이런형식으로 써야할텐데... 이것이 가능한가요? 궁금해서 몸이 비틀어질거같습니다...
시간이 갈 수록 마음이 조급해지네요 ㅠㅠ 빠르고 친절한 답변 기다리고 있겠습니다 :)
긴글 봐주셔서 감사합니다~
|