private void textBox_content_KeyPress(object sender, KeyPressEventArgs e) { int keyCode = (int)e.KeyChar; //46은 점 ( . ) if ((keyCode < 48 || keyCode > 57) && keyCode != 8 && keyCode!=46) { e.Handled = true; } if (keyCode == 46) { //null 일경우 || 이미 .이 있는경우 if (string.IsNullOrEmpty(this.textBox_content.Text) || this.textBox_content.Text.Contains('.') == true) { e.Handled = true; } } }


 

            string id = "id";
            string pw = "pw";
            string name = "테스트";



            //쿠키 값 설정
            string value = string.Format("{0}_{1}_{2}_{3}", DateTime.Now.ToString(), id, pw, name);


            //Cookie 추가
            string url = "http://localhost/";
            string cookieName = "MyTestCookie";

            bool state = NativeInternet.InternetSetCookie(url, cookieName, value);
            state = NativeInternet.InternetSetCookie(url, cookieName, value);


            //Cookie 가져오기
            StringBuilder sbValue = new StringBuilder();
            //sbValue.Capacity 초기 값 : 16
            int valueSize = 0;

            //처음 ManageCookie.InternetGetCookie 메서드를 호출 할 때에는 Value의 Size를 가져옵니다.

            state = NativeInternet.InternetGetCookie(url, cookieName, sbValue, ref valueSize);
            if (state == false)
            {
                //사이즈를 다시 조정합니다.
                sbValue = new StringBuilder(valueSize);
                //얻은 Value의 Size를 이용해서 다시한번 호출합니다.
                state = NativeInternet.InternetGetCookie(url, cookieName, sbValue, ref valueSize);
            }

 

출처 : http://crynut84.tistory.com/47

 

 

 

 

 

 

 

  public partial class NotifyForm : Form
    {

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern int SystemParametersInfo(int uAction, int uParam, out RECT lpvParam, int fuWinIni);

        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
        }


        public NotifyForm()
        {
            InitializeComponent();
            this.TopLevel = true;  
        }

        private void SetFormLocationToTray(Form form)
        {
            int SPI_GETWORKAREA = 0x0030; //작업영역을 알아오는 Flag
            RECT r = new RECT();
            SystemParametersInfo(SPI_GETWORKAREA, 0, out r, 0);
            Size s = form.Size;
            Point p = new Point(r.right - s.Width, r.bottom - s.Height);
            form.Location = p;
        }

        private void NotifyForm_Load(object sender, EventArgs e)
        {
            SetFormLocationToTray(this);
        }
    }

DragEnter 발생시에 Cursor 변경

        private void UserControlDrawingPaper_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : DragDropEffects.None;
        }


 

 

DragDrop시에 파일 경로 가져오기

        private void UserControlDrawingPaper_DragDrop(object sender, DragEventArgs e)
        {
            string []datas = (string[])e.Data.GetData(DataFormats.FileDrop);
            LoadImage(datas[0].ToString());
        }


 

VBScript의 Intellisense 기능 및 동적 코드 예제 MFC프로젝트 및 라이브러리입니다.

 

 

 

Embeddable script editor for MFC applications

 

원본 : http://www.codeproject.com/Articles/4552/Embeddable-script-editor-for-MFC-applications

 

VBScript Intellisense.zip

 

 

 

 

위의 이미지 처럼 프로그램 내에서 동적으로 Script 언어를

사용자에게 받아서 실행 시켜야 할 때가 있을 때 사용한다.

 

 

사용법

1. C# 프로젝트 생성

2. 참조 추가 COM

3. Microsoft Script Control 1.0 추가

 

 

4. MSScriptControl.ScriptControlClass 개체 생성하여 사용한다.

 

 

나머지 코드들은 첨부 파일에 첨부

(C# : AboutScriptControl.zip)

 

MFC 출처:

http://www.codeproject.com/Articles/2539/Adding-VBScript-and-JScript-support-in-your-C-appl

(MFC : ScriptDemo_demo.zip)

 

 

AboutScriptControl.zip

 

ScriptDemo_demo.zip

 

 

PowerPoint가 실행 되었는지 무한정 검사를 하고

PowerPoint의 SlideShow가 실행 되었는지 무한정 검사를하고

SlideShow가 종료 되었는지 무한정 검사

HowRunProcessCheck.zip

 

 

 

namespace HowRunProcessCheck
{
    class Program
    {
        /// <summary>
        /// PowerPoint MainWindowTitle명 (Office 2007)
        /// </summary>
        const string powerPointName = "Microsoft PowerPoint -";

        /// <summary>
        /// PowerPoint MainWindowTitle명 (Office 2007)
        /// </summary>
        const string slideName = "PowerPoint 슬라이드 쇼";

        /// <summary>
        /// PowerPoint
        /// </summary>
        Process powerPoint;

        /// <summary>
        /// PowerPoint Slide
        /// </summary>
        Process slide;

        static void Main(string[] args)
        {
            Program test = new Program();
            test.TestRunProcessCheck(); 
           
        }


        /// <summary>
        /// Test
        /// </summary>
        private void TestRunProcessCheck()
        {
            this.powerPoint = StartCheckProcess(powerPointName);
            Console.WriteLine("시작 {0}", this.powerPoint.MainWindowTitle);

            this.slide = StartCheckProcess(slideName);
            Console.WriteLine("시작 {0}", this.slide.MainWindowTitle);

            CheckAlive(this.slide);
            Console.WriteLine("종료 {0}", this.slide.MainWindowTitle);

            Console.ReadKey();
        }

        /// <summary>
        /// Process가 죽으면 Return
        /// </summary>
        /// <param name="pro"></param>
        private void CheckAlive(Process pro)
        {
            while (CheckProcess(pro.MainWindowTitle) != null)
            {
              
            }
        }

        /// <summary>
        /// MainWindowTitle이 title로 시작하는 Process 무한 검사
        /// </summary>
        /// <param name="title"></param>
        /// <returns></returns>
        private Process StartCheckProcess(string title)
        {
            while (true)
            {
                Process pro = CheckProcess(title);
                if (pro != null)
                {
                    return pro;
                }
                System.Threading.Thread.Sleep(1000);
            }
        }

        /// <summary>
        /// MainWindowTitle이 title로 시작하는 Process 검사
        /// </summary>
        /// <param name="title"></param>
        /// <returns></returns>
        private Process CheckProcess(string title)

        {
            Process[] processes = Process.GetProcesses();
            foreach (Process pro in processes)
            {
                if (pro.MainWindowTitle.StartsWith(title))
                {
                    return pro;
                }
            }
            return null;
        }

    }
}

자신이 개발한 닷넷 프로그램을 배포 할 때, 디컴파일러 프로그램(예: Reflector )으로 인해 소스가 노출 될 수 있습니다.

난독화 기능의 프로그램을 이용해서 네임스페이스, 클래스, 속성, 메서드, 지역 변수 등등 네이밍이 되어 있는 것들의 이름을

난해하게 변경해주면 디컴파일러로 소스를 본다고 하여도 어떠한 기능을 하는지 알 수 없게 만들 수 있습니다.

 

[이미지 1] 난독화 하기 전 후 모습

 

 

 

Visual Studio 2008 Visual Studio Tools 폴더에 설치되는 Dotfuscator Community Edition 프로그램을 이용하여

난독화를 하는 과정에 대해 설명하겠습니다.

 

 

[이미지 2] 프로그램 실행시 뜨는 창

 

Dotfuscator Community Edition 프로그램을 실행시키면 위의 창의 뜨게 됩니다.

"아니요, 등록하지 않습니다." 버튼을 클릭합니다.

 

 

 

[이미지 3] 프로젝트 형식선택

 

"새 프로젝트 만들기"를 선택하신 후 확인을 누릅니다.

 

 

 

[이미지 4] 어셈블리를 목록에 추가

 

입력 탭이 Default로 선택되어 있습니다. "빨간색 부분의 어셈블리를 찾아서 목록에 추가" 버튼을 클릭합니다.

입력 어셈블리 추가 창이 뜨면 찾아보기 버튼을 눌러 난독화할 어셈블리를 지정하고 확인 버튼을 클릭합니다.

 

 

 

[이미지 5] 어셈블리 선택

 

저는 제가 만든 실행 파일과 함께 필요한 dll들을 선택하였습니다.

 

 

 

[이미지 6] 추가된 모습

 

어셈블리들이 추가된 모습을 확인 하실 수 있습니다.

 

 

 

[이미지 7] 제외할 특정 항목 선택하기

 

이름 바꾸기 탭을 클릭하시면 제외 탭에 제외할 특정 항목을 선택 하실 수 있습니다.

실제 ChartFX를 디컴파일러로 소스를 확인 할 경우, 사용자에게 제공되는 부분은 그대로 노출하되 core들은 a1, a2, 32 등등 난해하게 되어 있습니다.

자신이 만든 라이브러리를 개발자에게 공개할 때, core들은 감추고 싶을 때, 이 기능을 사용하면 유용할 것입니다.

 

 

[이미지 8] 빌드 완료

 

빌드 탭으로 이동 후 "빌드" 버튼을 클릭한 후 Dotfuscator 프로젝트를 저장해줍니다.

지정한 곳에 난독화된 어셈블리파일이 생성됩니다.

위의 이미지 처럼 이름을 바꾼 개수와 이름을 바꾼 비율 확인 하실 수 있습니다.

 

 

 

[이미지 9] 빌드한 후의 내부 코드

 

변경한 어셈블리들의 내부 코드입니다. 네임스페이스명은 사라지고 클래스명들은 a,b,g,h 등 난해하게 변경 되었습니다.

난독한 프로그램 실행시 아무 문제 없이 잘 실행 되는 것을 확인 하실 수 있습니다.

C# Hooking 오픈 소스입니다.

예제 프로젝트도 함께 있습니다.

 

globalhook2_src.zip

 

 

참고:

http://www.codeproject.com/Articles/7294/Processing-Global-Mouse-and-Keyboard-Hooks-in-C

 

지정한 폴더 감시하기

 

1. 개요

[그림 1. 프로그램 동작화면]

파일을 공유하는 프로그램을 작성하다 보면, 특정 폴더에 있는 파일 및 폴더의 정보를 실시간으로 리스트에 띄워주어야 하는 경우가 발생할 수 있습니다.

여기에서는 이러한 경우에 필요한 기술 노하우를 전달하려고 합니다.

 

이를 위해 [그림1. 프로그램 동작화면]과 같이 특정 폴더 안에 파일 및 폴더가 생성, 이름변경, 삭제가 발생 하였을 때,

파일 목록 리스트를 갱신하고 Log를 남기는 예를 보여주고자 합니다.

 

2. 얻을 수 있는 기술

-지정한 폴더 감시

-특정 폴더의 파일 정보 얻기

 

3. 사용할 Class 소개하기

FileSystemWatcher : 파일 시스템 변경 알림을 수신하면서 디렉토리 또는 디렉토리의 파일이 변경되면 이벤트를 발생시킵니다.

-네임스페이스 : System.IO

-어셈블리 : System(System.dll)

 

 

    

속성

설명

Path

조사할 폴더의 경로를 가져오거나 설정

NotifyFilter

조사할 변경 내용 형식을 가져오거나 설정

Filter

폴더에서 모니터닝할 파일을 결정하는데 사용되는 필터 문자열을 가져오거나 설정,

특정 파일 감시 ex)*.exe,(모두 감시"", *.*) 

EnableRaisingEvents

구성 요소가 활성화 되는지 여부를 나타내는 값을 가져오거나 설정

 

 

const string FolderName = "Test";

FileSystemWatcher fs = new FileSystemWatcher();//개체 생성 
										

fs.Path = FolderName; //Test 폴더 감시 
										

fs.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName; 

fs.Filter = ""// *.*
										

              

fs.Created += new FileSystemEventHandler(fs_Created); 

fs.Deleted += new FileSystemEventHandler(fs_Deleted); 

fs.Renamed += new RenamedEventHandler(fs_Renamed);               

fs.EnableRaisingEvents = true//이벤트 활성화 
										

 

 

 

DirectoryInfo : 디렉토리 및 하위 디렉토리를 만들고, 이동하고, 열거하는 인스턴스 메서드를 노출합니다.

-네임스페이스 : System.IO

-어셈블리 : mscorlib(mscorlib.dll)

const string FolderName = "Test";

DirectoryInfo dti = new DirectoryInfo(FolderName); //개체 생성
										

FileInfo[] files = dti.GetFiles();   //해당 폴더의 파일정보 얻기

 

 

4. 프로그래밍 UI 디자인

단계1. 프로젝트 생성

[그림 2. 프로젝트 생성]

    

    단계2. Form UI 디자인하기

    

[ 그림 3. Form UI 디자인하기]

5. 프로그래밍하기

5.1 프로그래밍에 앞서 고민하기

이 프로그램에서 처리할 이벤트를 생각해 봅시다.

먼저, Form이 Load되는 시점에 이벤트를 등록하여야만 프로그램 동작 중에 감시하는 폴더의 이벤트를 감지 할 수 있겠습니다.

또한 감시하는 폴더에 원래 존재 하였던 파일들의 정보도 얻어와서 리스트 박스에 띄워줘야 하기 때문에 DictionaryInfo 클래스를 이용해

감시하는 폴더의 파일들의 정보를 얻어와서 listBox_filelist에 아이템을 추가해줍니다.

프로그램 초기화는 끝났고, 이제 프로그램 동작 시점에 대해 설명해드리겠습니다.

FileSystemWatcher 개체에서 파일이 생성 되었다면, listBox_filelist에 아이템을 추가하고,

수정되었다면 아이템을 찾아서 아이템을 수정하고, 삭제되었다면 아이템을 찾아 삭제해주면 되겠습니다.

이 모든 이벤트들은 listBox_log에 아이템을 추가하게 됩니다. 주의 할 점은 이벤트 발생시 ListBox 컨트롤에 접근하므로 크로스쓰레드 문제를 처리해야 합니다.

 

5.2 본격적으로 프로그래밍하기

노하우를 효과적으로 전달하기 위하여 설계와 OOP 철학에 대한 부분은 생략하도록 하겠습니다.

컴파일을 하여 Debug 폴더 생성 후 테스트를 위한 Test폴더를 생성 합니다.

Form이 Load 되었을 때, Test폴더의 파일 정보를 얻는 InitFilelist 메소드와 폴더를 감시할 개체를 생성하는 InitFileSystemWatch 메소드를 호출합니다.

InitFileSystemWatch 메서드에서는 FileSystemWatch 개체를 생성 후, 속성들의 값을 넣어주고 이벤트 핸들러를 등록 합니다.

마지막으로는 이벤트 발생 여부 속성인 EnableRaisingEvents의 값을 true로 지정해줍니다.

 

 


										

public partial class Form_filesystemwatcher : Form
										

{

    const string FolderName = "Test";

    public Form_filesystemwatcher()

    {

        InitializeComponent();

    }

 

    private void Form_filesystemwatcher_Load(object sender, EventArgs e)

    {

        InitFilelist();

        InitFileSystemWatcher();

    }

 

    private void InitFilelist()

    {

        DirectoryInfo dti = new DirectoryInfo(FolderName);

        FileInfo[] files = dti.GetFiles();

        foreach (FileInfo file in files)

        {

            listBox_filelist.Items.Add(file.Name);

        }

    }

 

    private void InitFileSystemWatcher()

    {

        FileSystemWatcher fs = new FileSystemWatcher();

        fs.Path = FolderName; 

        fs.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName; 

        fs.Filter = ""

        fs.Created += new FileSystemEventHandler(fs_Created); 

        fs.Deleted += new FileSystemEventHandler(fs_Deleted); 

        fs.Renamed += new RenamedEventHandler(fs_Renamed);    

        fs.EnableRaisingEvents = true;     }

 

 

FileSystemWatcher 개체에서 이벤트가 발생되면 AddLog 메소드를 이용해 Log를 남기고,

추가, 수정, 삭제 되었을 때의 처리를 해줍니다. 크로스쓰레드 문제를 해결 하기 위하여 delegate를 이용하였습니다.

delegate void FileListboxDele(string text, WatcherChangeTypes watcherChangeTypes);

delegate void LogListboxDele(string text);

void fs_Created(object sender, FileSystemEventArgs e)

{

    AddLog(e.FullPath, e.ChangeType.ToString());

    UpdateFileList(e.Name, e.ChangeType);

}

void fs_Renamed(object sender, RenamedEventArgs e)

{

    AddLog(e.FullPath, e.ChangeType.ToString());

    ModFileList(e.OldName, e.Name);

}

void fs_Deleted(object sender, FileSystemEventArgs e)

{

    AddLog(e.FullPath, e.ChangeType.ToString());

    UpdateFileList(e.Name, WatcherChangeTypes.Deleted);

}

 

private void AddLog(string fullPath, string eventName)

{

    string log = string.Format("Path :{0} , Event :{1}", fullPath, eventName);

    listBox_log.Invoke(new LogListboxDele(AddLog2), new object[] { log });

}

private void AddLog2(string log)

{

    listBox_log.Items.Add(log);

}

 

private void UpdateFileList(string filename, WatcherChangeTypes watcherChangeTypes)

{

    listBox_log.Invoke(new FileListboxDele(UpdateFileList2), new object[] { filename, watcherChangeTypes });

}

 

private void UpdateFileList2(string filename, WatcherChangeTypes watcherChangeTypes)

{

    switch(watcherChangeTypes)

    {

        case WatcherChangeTypes.Created: AddFileList(filename); break;

        case WatcherChangeTypes.Deleted: DelFileList(filename); break;

    }

}

 

private void AddFileList(string filename)

{

    listBox_filelist.Items.Add(filename);

}

private void ModFileList(string oldName, string name)

{

    UpdateFileList(oldName, WatcherChangeTypes.Deleted);

    UpdateFileList(name, WatcherChangeTypes.Created);

}

private void DelFileList(string filename)

{

    listBox_filelist.Items.Remove(filename);

}

 

 

 

How_to_-_지정한_폴더_감시하기.docx

 

How_to_-_지정한_폴더_감시하기.zip

+ Recent posts