얼떨결에 삼성 소프트웨어 멤버쉽 1차 서류전형을 합격하고 기술면접을 보게되었다.
서류 전형 합격(8일) 후 기술면접(15일)까지 남은 기간은 1주일.
이 기간안에 최대한 빨리 프로그램을 마무리 짓고 PPT 발표 자료를 만들고, 발표 연습을 끝내야했다.
TOEIC 단어 스터디, 어학원 TOEIC R/C강좌를 일주일간 그만두고서까지 매달렸지만
결국 면접보기 하루 전날 까지 버그와의 싸움을 하느라 코딩을 멈출 수가 없었다.
틈틈이 PPT를 손보면서 발표내용을 살짝 정리해놓은게 천만 다행이었다.
서류전형에 합격할 줄 알았더라면 서류전형 지원하고나서 1주일동안 좀 놀지 않고
열심히 작품 완성도를 더 높였을텐데, 고작 서류전형 하나 내놓고 큰 일 하나 치룬듯 쉬었던게 부끄럽다.
나는 부산멤버쉽에 지원했기에 같이 서류전형에 합격하여 15일에 면접을 보는 동기들이랑 하루 전에 올라와
기술면접실에 직접가서 내 노트북이랑 연결도 해보고 바로 근처에 모텔을 잡았다.
면접실에선 고등학교 컴퓨터동아리 선배를 만났었다. 18기로 있던데... 이런데서 아는 사람을 만날줄이야.
군대서 고등학교선배를 만났을때처럼 반갑더라. ㅋㅋㅋ 뭔가 좀 안정되는 느낌
모텔인데 인터넷도 되고 벽걸이형 TV에... 시설이 좋더라. 두명 쓰는 방에 4만원줬는데 괜찮은 듯.
새벽 늦게까지 기술면접 준비를 하느라 잠을 못잤다.
PPT발표 준비랑 시연 준비,
그리고 삼성소프트웨어 기술면접 후기를 검색했더니 C,C++ 의 기분문법 같은 수준의 질문도 많이 하는 것 같길래
내 프로그램과 관련하여 후킹이라던가 .NET FRAMEWORK 의 구조와 특징, 델리게이트 등등...
예상 질문에 대한 대답 등을 연습하다보니 어느덧 새벽 3시. 그리고는 기절하듯 잠들어버렸다.
아침 9시에 첫번째로 면접을 보게 된 친구가 한시간도 채 지나지 않아 면접을 보고 모텔로 돌아왔다.
면접관이 프로그램에 대해서 구체적으로 캐묻기도 하고 그런다는데 어휴, 이때부터 나도 좀 긴장되기 시작한다.
다들 오전에 면접인데 나만 오후2시 30분... 나도 얼른 면접 보고 끝내고 싶은데.
어영부영 시간은 가고 점심을 먹고서 다들 먼저 진주로 내려가고,
내 순서 30분 전에 면접실에 도착했다.
어제 만났던 고등학교 선배가 1층에서 도우미를 하고 계시다가 격려 해주시고
마침 건물에서 나가시던 우리과 선배 두분도 만나서 잘 하라고 격려 해주시고...
흠흠.
면접대기실에 갔었는데 다른 사람들이 자기 면접 시간 제대로 안지키고...
뭐 급한일 있다고 먼저 본다고 하고...
내 차례 되서 들어갔더니만 어제 랜선 준비해달라고 말도 했었고 오늘 와서 물어보니 셋팅도 되있다더니만
면접실 들어가니깐 되있기는 뭐 -_- 어제 그대로더만... 랜선이 바로 준비가 안되서 난 순서 밀리고...
결국 그날 맨 마지막 면접자가 되버렸다.
드디어 내 차례가 되어 면접실에 들어가고, 면접 시작!
준비한 PPT 발표는 순조롭게 진행되었다.
중간중간에 두어개 질문을 하시기는 했는데 뭐 무난하게 대답했다. 뭘 질문하셨는지는 기억이 안나고 ㅡ.ㅡ
모르는 부분에 대해서는 아는 정도까지만 대답을 하고 더 자세히는 모른다고 솔직히 말했다.
내가 이제 내세울 부분들은 열정과 가능성.
그 부분을 강하게 어필하기 위해 목소리도 나름 씩씩하고 자신있게 내고, 태도도 당당하게 보이려 애썼다.
시연 도중에 USB메모리를 해제하면 바로 경보음이 발생해야하는데 USB메모리 연결을 했는데...
아무런 반응이 없더라. 연결하고 다시 해제하고... 이러길 두어번.
정적이 흐르고...
이러다 갑자기 윈도우메시지가 한번에 몰려서 전달된듯 버벅이더니만 경고음이 나온다.
휴우ㅠ_ㅠ
내 프로그램과 관련하여 계속 질문을 하셨는데 대부분 다 자신있게 내 프로그램에 대해 설명했었고
음소거 상태일때도 경보음이 발생되냐고 질문하시길래 난 음소거가 볼륨이 0이 되는 개념인지 알고
당연히 볼륨을 최대볼륨으로 하여 경보음을 발생시키기때문에 음소거를 하더라도 상관없다고 말했다.
보여달라 하시길래 음소거를 하고 시연해보니... 경보음이 안난다 -_-
음소거가 볼륨을 0을 만드는게 아니라 아예 사운드를 차단하는 듯... 휴우 =3 ...
기술 외적인 질문으로는
Q : 준비해온 작품 외에 다른 프로젝트 경험은?
A : 학부과정으로 C, C++, JAVA를 배우면서 했던 과제 수준의 프로젝트 외에는 없고
이 프로그램이 처음으로 프로그램에 대한 내 열정이 깃들여진 처녀작입니다.
Q : 학교가 진주인데 부산까지 다니려면 힘들지 않을까?
A : 휴학하고 멤버쉽생활에 더 집중하고 멤버쉽 수료후 복학하여 학교를 졸업하겠습니다
( 난 이때까지 멤버쉽은 1년이나 2년정도 수료를 하는거지 학교생활과는 별개인줄 알았다 -_- )
Q : (웃으시며) 여긴 그런 곳이 아니다. 학교생활도 같이 병행해야한다.
A : 그렇다면 수업을 월화수요일 등으로 몰아서 들으면서 멤버쉽생활을 하여 지장이 없도록 하겠습니다.
Q : 경상대 컴퓨터과라면, CSSM 이라는 동아리 소속인가?
A : 동아리라기보다는 과 내의 소모임입니다.
Q : SSM을 통해 삼성전자로 들어오려는 목적으로 변질될 가능성도 있을 것 같은데.
A : SSM이 창의력과 열정 들을 보고 멤버를 뽑듯이 CSSM(Computer Science Software Membership)도
그러한 프로그래밍에 대한 열정 등을 보고 선발하며, 그런 가능성을 최대한 배제시키려 노력중입니다.
음... 이 질문들 말고 다른 질문들도 있었던 것같은데 잘 기억이 나지 않는다.
나머지는 다 내 작품과 관련된 질문들이었으니까.'
굉장히 편안한 분위기에서 면접을 볼 수 있었다.
내가 잘 모르는 부분에 대해서는 설명해주시며 가르쳐주시기도 하고,
내 프로그램이 더 발전하기 위핸 방향도 제시해 주시기도 하셨다.
난 이상하게 다른 문법적이나 기술적인 용어 등에 대한 질문은 없었다. 다행인건지 불행인건지...
시간이 어떻게 흘렀는지도 모른채 면접은 끝났다.
홀가분한 기분.
완벽했다고는 할 수 없지만 나름대로 최선을 다 했던 면접이었다.
이정도면 내가 할 수 있는 만큼 한 것 같다.
즐거웠고, 재밌고, 유익한 경험이었다.
고등학교 선배가 나 면접 끝날때까지 기다려주시고 밥까지 사주셔서
밥먹으며 이런 저런 멤버쉽관련 이야기를 나누고 ... 날이 저물어서야 진주로 내려왔다.
동아리에서 단체로 삼성소프트웨어멤버쉽(SSM)에 지원하는 날이 바로 코앞으로 다가왔다.
1월 4일까지.
한달간을 기말고사에 투자하느라 코딩은 커녕, Visual Studio 도 못켜본 것 같은데
내 프로그램이지만 기억도 가물가물한 것이...ㅠ_ㅠ
부랴부랴 작품설명과 시스템구조도를 그린다는 것이 어휴. 하루종일 걸려서 겨우 완성했는데
선배한테 검토받고나니 이것저것 고칠것이 한두가지가 아니다.
message.Subject = "Concentrate on THIS LOG of Labtop which was stolen by thief";
message.SubjectEncoding = Encoding.UTF8;
message.Body = "This is the thief's log\n\n";
message.Body += strLog;
message.BodyEncoding = System.Text.Encoding.UTF8;
message.Priority = MailPriority.Normal;
if (existAttachment == true) { String file = "scene.jpg"; Attachment attachment = new Attachment(file, MediaTypeNames.Application.Octet); message.Attachments.Add(attachment);
}
smtp.Send(message);
}
catch (FileNotFoundException ee) // 파일 없으면 파일첨부 안하고 보내기
{
MessageBox.Show(ee.ToString());
existAttachment == false;
SendLog();
return;
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
return;
}
finally
{
MessageBox.Show("Sending Log has been complete");
}
}
전에 전역후킹 키로그 파일을 메일로 보내는 것까지 구현했었는데
이번에 내 프로그램에 웹캠을 이용한 촬영기능까지 넣으면서 jpg파일을 메일로 첨부할 필요가 생겼다.
노트북 절도자의 얼굴까지 사진으로 찍어서 메일로 오면 그야말로 금상첨화!!!
파일 첨부를 해서 메일을 보내니 자꾸 전송이 실패되길래 왜 안되나 하고 종일 삽질했었는데
알고보니 내가 파일명을 잘못적었었다. 이런 멍청한 -_-
원래 로그만 전송할땐 2~3초 정도 버벅거렸었기에
'우와 달랑 1kb도 안될 로그를 전송하는데 이렇게 버벅이면 100kb넘는 그림파일은 얼마나 버벅이려나 했는데'
한 5초 정도밖에 버벅이지 않았다. 뭐 버벅인다기보다는 마우스 움직임이 조금씩 끊기는 정도의...(ㅠ_ㅠ)a
메일 전송 테스트하다가 방금 알게된건데...
IP주소까지 전송시키게 해놨더니 공유기의 내부 IP가 날아온다. 192.168... -_-
외부IP를 저장시켜서 전송시켜야겠다.
이건 또 어떻게 한담~ 휴우~
using System.Net.Mail;
using System.Net;
...
...
...
MailMessage message = new MailMessage();
message.From = new MailAddress("pskalyber@gmail.com", "박상근", Encoding.UTF8);
message.To.Add(new MailAddress("pskalyber@gmail.com", "박상근", Encoding.UTF8));
message.Subject = "Concentrate on THIS LOG of Labtop which was stolen by thief";
message.SubjectEncoding = Encoding.UTF8;
message.Body = "This is the thief's log\n";
message.Body += "Kill htm";
message.BodyEncoding = System.Text.Encoding.UTF8;
message.Priority = MailPriority.Normal;
SmtpClient smtp = new SmtpClient("smtp.gmail.com");
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.EnableSsl = true;
smtp.UseDefaultCredentials = true;
smtp.Credentials = new NetworkCredential("ID", "PASSWORD");
VS 2008 로 열어서 csproj 파일을 sin으로 바꾸고 실행해보니,
음 괜찮다. 이걸 txt에 저장하도록 바꾸고, 폼을 안보이게 하고
잘 눈치 못채게 숨기면 될 것같다.
일단 소스를 옮긴 다음에 조금씩 바꿔볼려고
VS 2008 에서 새 프로젝트를 만들어서 소스를 그대로 옮겨왔는데,
왠걸...
SetWindowsHookEx(...)으로 값을 할당받은 Hmouse 변수의 값이 변화가 없다.
SetWindowsHookEx()...가 먹히지 않는다.
도대체 뭐가 문제인지.
소스를 그대로 옮겨왔는데도 불구하고...OTL
괜히 이것저것 고쳐보고 하다가 시간만 흘러가고ㅠ_ㅠ
오늘은 그냥 여기까지만 하고 체념할때즈음에
저 소스를 구했던 곳의 Q&A를 보니 누군가가 How to make debugging work in VS2008 (express) with these hook?
이렇게 질문해놓은 글을 보았다.
그리고 그에 대한 친절한 답변.
The answer is simple:
0: Copy UserActivityHook.cs to your project, add an instance of the UserActivityHook object, set up the event handlers, enter Debug mode, and waste a couple of hours trying to fix the Win32Exceptions thrown on lines 538 and 562 before coming back to this site and seeing this solution.
1: Go to the project properties page (right-click the project name and select properties)
2: Go to the Debug tab and uncheck "Enable the Visual Studios hosting process"
3: Realize that the ctrl and alt keys map to Keys.LControlKey, Keys.RControlKey, Keys.LMenu, and Keys.RMenu, since you're now able to see the results of each of your key presses. (It really makes a lot more sense, now that I can see how Windows is managing each of the keys... Just wasn't obvious before.)
으하하
이렇게 난 해결을 보고야 말았다.
좋구나, 조금씩 조금씩 완성에 다가가는 이 느낌♬
public delegate int LowLevelKeyboardProcDelegate(int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam);
private const int WH_KEYBOARD_LL = 13; // idHook - type of hook procedure
private static int intLLKey; // hook handle (return value)
//private static LowLevelKeyboardProcDelegate lpfn; // pointer to the hook procedure
private void LockKeyboard()
{
[DllImport("user32", EntryPoint = "SetWindowsHookExA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling =
true)]
public static extern int SetWindowsHookEx(int idHook, LowLevelKeyboardProcDelegate lpfn, int hMod, int dwThreadId);
[DllImport("user32", EntryPoint = "UnhookWindowsHookEx", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling =
true)]
public static extern int UnhookWindowsHookEx(int hHook);
[DllImport("user32", EntryPoint = "CallNextHookEx", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling =
true)]
public static extern int CallNextHookEx(int hHook, int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam);
// needed to disable start menu
[DllImport("user32.dll")]
private static extern int FindWindow(string className, string windowText);
[DllImport("user32.dll")]
private static extern int ShowWindow(int hwnd, int command);
// needed to get module handle
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr GetModuleHandle(string lpModuleName);
public struct KBDLLHOOKSTRUCT
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
public int LowLevelKeyboardProc(int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam)
{
bool blnEat = false;
switch (wParam)
{
if (blnEat == true)
{
return 1;
}
else
{
// chain to the next hook procedure. allow other applications that
// have installed hooks to receive hook notification
return CallNextHookEx(0, nCode, wParam, ref lParam);
}
}
private const int SW_HIDE = 0;
private const int SW_SHOW = 1;
public void KillStartMenu()
{
int hwnd = FindWindow("Shell_TrayWnd", "");
ShowWindow(hwnd, SW_HIDE);
}
public static void ShowStartMenu()
{
int hwnd = FindWindow("Shell_TrayWnd", "");
ShowWindow(hwnd, SW_SHOW);
}
}
이리저리 C#에서 CtrlAltDel, AltF4, AltTab 키 막을려고 후킹소스를 뒤지는데
검색결과마다 어느 한 소스를 두고, 이게 제대로 실행이 안된다는 내용들의 글이었다.
그 소스를 구해서 해보니 CtrlAltDel기능만 막히고 AltTab이랑 Win키는 못막아지더라.
짧은 영어 실력으로 다른 사람들의 Answer, Reply을 읽어가면서 찾던도중
ㅋ ㅑ ~
드디어 찾았다. 그리고 ... 내 프로그램에 적용시켰다. 성공이다.
이것때문에 거의 일주일을 헤맸는데 ( 뭐 그동안 놀고 먹느라 바쁘기도 했지만 )
기존에 구했던 소스랑 똑같은데 대체 어디가 조금 달라서 기능이 실행된건지
수업 듣고 와서 저녁먹고 한번 찾아봐야겠다.
AlT+F4, ALT+TAB, CTLR + ESC, Windows 키를 막으려고 이리저리 검색했는데
FormClosing 이벤트로 Alt+F4 가 안막히게 구현하는 방법을 찾았다.
원래 내가 의도한건 키보드 키 자체를 안먹히게 하는거였는데.
이제 나머지 다른 키들을 인식안되게 하려고 하다가
어느 외국 사이트에서 Alt+Tab에 관한 소스를 찾았다.
그래서 신나게 소스 적용하고보니...
ALT+Tab 을 막은게 아니라 AlT+Tab 했을때 나오는 아이콘들 중에
내가 지정한 프로그램의 아이콘이 안나오게 하는 소스였다 -_-
[DllImport("user32.dll")]
public static extern int SetWindowLong(IntPtr window, int index, int value);
[DllImport("user32.dll")]
public static extern int GetWindowLong(IntPtr window, int index);
const int GWL_EXSTYLE = -20;
const int WS_EX_TOOLWINDOW = 0x00000080;
const int WS_EX_APPWINDOW = 0x00040000;
//Calling after InitializeComponent, or form load events
int windowStyle = GetWindowLong(this.Handle, GWL_EXSTYLE);
SetWindowLong(this.Handle, GWL_EXSTYLE, windowStyle | TOOLWINDOW);
휴우 빨리 키 막기 기능 넣고나서
다음 기능들을 추가해야하는데 ㅠ_ㅠ
늘 삽질의 연속이군하~
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using WaveLib.AudioMixer;
namespace MyProgram
{
public partial class ScreenSaver : Form
{
기본적인 폼의 형태를 대충 갖추고,
전원장치와 USB의 해제에 대한 경고음 이벤트까지 대충 완성했다
Timer.Stop()의 위치와 유무때문에 전원해제에 대한 이벤트가 제대로 먹히지 않아서 삽질했다
이렇게 하고나서 코드들을 보니, 아... 말로만 듣던 스파게티 소스가 이런것인가 싶다.
오디오 제어 관련 소스는 하다하다 못해서
그냥 공개된 다른 이의 소스 프로젝트를 그대로 첨부해서 쓰고있고-_-
주석은 한줄도 없이 막코딩하다보니 이제 슬슬 내가 헷갈려가기도 한다.
얼른 코드 더 길어지기 전에 주석도 달고 스파게티도 좀 풀어야지