article search result of 'c#' : 24

  1. 2012.05.17 [WCF] 분산서버 데모 (77)
  2. 2012.05.05 [ASP.NET] 클라이언트가 멀티파트 보내고 서버가 받기 (77)
  3. 2011.11.21 [C# , AS3 , ETC] 한글 유니 코딩 조합 원리 (115)
  4. 2011.10.16 [C# 서버에서 AS3 클라이언트 비정상 종료 체크하기] (164)
  5. 2011.09.05 [User32.dll] 윈도우 위치 지정 하기 (2531)
  6. 2011.08.22 [C# , SMTP]구글 SMTP 로 메일 보내기 (97)
  7. 2011.06.09 [TwitPic 모듈] 트윗픽을 손쉽게 활용하자 (998)
  8. 2011.03.10 [SimpleFileWriter] AS3 에서 파일을 저장하자 (165)
  9. 2011.03.04 [TCPSocket] 안전한 Socket 연결과 버퍼데이터를 설정한 데이터전송 (C# <-> As3) (148)
  10. 2011.02.01 [XNA , WPF] XNA 에서 코드레벨로 WPF 생성하기 (165)
  11. 2011.02.01 [C#] 현재 윈도우의 Top 핸들 얻기와 익스플로러로 타입캐스팅 하기 (81)
  12. 2011.01.31 [C#] 활성윈도우 이름 과 핸들 알아내기 와 익스플로러 주소값 알아내기 (194)
  13. 2011.01.25 [Shell32.DLL] *.LNK , *.URL 분석하기 (84)
  14. 2011.01.19 [new Thread in new Form] 새로운 쓰레드 안에 새로운 윈도우폼 (110)
  15. 2011.01.17 [AxShockwaveFlashObjects] AS3 in C# (122)
  16. 2011.01.16 [.Net Profiler] ANTS Memory Profiler 사용해보기 (158)
  17. 2011.01.10 [LINQ _ XML] 간략한 LINQ to XML 사용법 (167)
  18. 2011.01.07 [Zxing , QR Sample ] C# 에서 QR 라이브러리 사용하기 (256)
  19. 2010.12.18 [XNA on TUIO] CCV 1.4 <- TUIO -> XNA (128)
  20. 2010.12.06 [c#] 익명타입의 (열거)배열 (71)
  21. 2010.12.06 [c#] 간단한 Generic List (221)
  22. 2010.12.05 [C# ,쉬운 이터레이터 만들기] Yield 키워드 간단히 개념잡기 (188)
  23. 2010.12.04 [socket] c# server , as3 client (143)
  24. 2010.12.04 [CustomEvent] C# 의 사용자 이벤트 작성 (48)

[WCF] 분산서버 데모

 

 

Yamecoder 야매코더_
분류없음 2012.05.17 10:17

[ASP.NET] 클라이언트가 멀티파트 보내고 서버가 받기

 

 

 

 

 

 

참고 : http://www.scripter.co.kr/entry/c-MultipartUpload

클라이언트 :

string url = "http://someServerApp.aspx"; FileStream fs = File.Open(@"d:\a.jpg", FileMode.Open, FileAccess.Read); byte[] data = new byte[fs.Length]; fs.Read(data, 0, data.Length); fs.Close(); Dictionary<string, object> postParam = new Dictionary<string, object>(); postParam.Add("1stParam", "1stValue"); postParam.Add("2ndParam", "2ndValue"); postParam.Add("file", new MultiPartUpload.FileParameter(data , "abc.jpg" , "image/jpeg")); HttpWebResponse webResponse = MultiPartUpload.MultipartFormDataPost(url, "", postParam); StreamReader reader = new StreamReader(webResponse.GetResponseStream()); TraceBox.trace(reader.ReadToEnd()); webResponse.Close();

;

 

 

 

서버 :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml.Linq;
using System.IO;
namespace SimpleRequest
{
    public partial class test : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            print("post count : " + this.Request.Form.Count + Environment.NewLine);
            foreach (string str in Request.Form)
            {
                print("name : " + str + "     value : " + Request.Form[str]);
            }

            print("FileCount : " + Request.Files.Count);
            if (Request.Files.Count == 0)
                return;

            HttpPostedFile file = Request.Files[0];
            print("-- fileName : " + file.FileName);
            print("-- fileSize : " + file.InputStream.Length);
        }

        private void print(object str)
        {
            Response.Write(str.ToString() + Environment.NewLine);
        }
    }
}
;

 

Request.Files 에서 파일 스트림을 포함한 정보를 얻을수 있다.

Yamecoder 야매코더_
C# 2012.05.05 23:27

[C# , AS3 , ETC] 한글 유니 코딩 조합 원리


 





//참고 원문 : http://uuzazuk9.egloos.com/906488


한글 조합 공식 :
[{(초성)×588}+{(중성)×28}+(종성)]+44032

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace TEST_Keyboard2
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        protected override void OnInitialized(EventArgs e)
        {
            base.OnInitialized(e);
            string result = ResultKorean("ㅇ", "ㅢ", "ㅇ"); //읭
            Console.WriteLine(result);
        }

        private string row_chosung = "ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ";
        private string row_jungsung = "ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ";
        private string row_jongsung = " ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ";

        private string ResultKorean(string chosung, string jungsung, string jongsung)
        {
            int chosungIndex = row_chosung.IndexOf(chosung);
            int jungsungIndex = row_jungsung.IndexOf(jungsung);
            int jongsungIndex = row_jongsung.IndexOf(jongsung);


            //공식
            int result = ((chosungIndex * 588) + ((jungsungIndex * 28) + jongsungIndex)) + 44032;


            char temp = Convert.ToChar(result);
            return temp.ToString();
        }

    }
}



간단한 유니코드의 연속 이라 .. 다른 언어에도 쉽게 적용할수 있을것 같다.
Yamecoder 야매코더_
C# 2011.11.21 17:07

[C# 서버에서 AS3 클라이언트 비정상 종료 체크하기]


TcpServer 에서 얻어온 client = server.AcceptTcpClient(); 

그리고

client.Client.Connected

라는 속성이 있는데 , 이것은 swf 가 종료 되었을때 체크가 불가능 하다.
그래서 예전에는 [한번 연결 , 한번 송수신 , 바로 종료] 의 매커니즘으로 안전적인 연결을 보장했다.

참고 (http://www.scripter.co.kr/entry/TCPSocket-안전한-Socket-연결과-버퍼데이터를-설정한-데이터전송-C-As3)

하지만 계속 연결을 보장해야 하는경우도 있지 않을까...

역시나 문제는 연결이 지속가능한지를 체크하여 소켓 루프를 사용가능한 상태로 만들어야 하는데 방법이 마땅치 않았다. 구지 방법을 찾자면 서로가 지속적으로 소켓을 통해

[서버 : 잘있냐? , 클라이언트 : 잘있다.] 는 연결이 건재함,
[서버 : 잘있냐? , 클라이언트 : ....] 는 연결이 손실됨 , 다시 연결 요청 

와 같이 지속적으로 물어 보는 방법이 있는데 매우 비효율적인 방법 아닌가... 참으로 서버와 클라이언트 , 둘다 득될것이 없는 방법이다.

그러던 와중 방법을 찾아 내었다.

 
while (true)
            {
                // 클라이언트 대기
                trace("wait....");
                TcpClient client;
                try
                {
                    client = server.AcceptTcpClient();
                }
                catch
                {
                    trace("ERR>> 비정상 종료");
                    return;
                }


                //환영 메세지
                byte[] sendByte = StringUTIL.StringToByte("connect Ok");
                client.GetStream().Write(sendByte, 0, sendByte.Length);
                client.GetStream().Flush();

                trace("send!");

                // client.GetStream().ReadByte()를 체크한다. 
                // 만약 연결이 유지 되고 있다면 -1 이 아닐테지만
                // swf 가 비정상 종료 , 혹은 종료 되거나 하면 -1 을 호출하여 
                // 아래의 루프를 벗어날것이다. 그리하여 소켓은 다시 사용 가능한 상태가 된다.    
                while (client.GetStream().ReadByte() != -1)
                {
                    //Console.WriteLine(c + " " + client.GetStream().ReadByte() );
                    
                    if (client.GetStream().DataAvailable)
                    {
                        NetworkStream ns = client.GetStream();
                        ns.Read(headerBuffer, 0, headerBuffer.Length);
                        string header = Encoding.ASCII.GetString(headerBuffer).Trim();
                        trace("header :" + header);

                        if (header == "close")
                        {
                            trace("cloader header!");
                            break;
                        }
                    }
                }
                trace("end!");


위의 코드 처럼 while (client.GetStream().ReadByte() != -1) 를 체크하여 루프를 돌린다면 충분히 체크가 가능하다.

물론 swf , 즉 클라이언트 프로그램이 종료 될때 close() 를 호출하여 서버에 [ 클라이언트 : 나 종료함! ~] 이라고 알려 줘야 하는게 정상이나 , swf 같은경우에는 프로그램이 종료될때 호출할수 있는 이벤트가 없다.
(하지만 AIR 는 있다.)

따라서 이부분때문에 연결을 유지 하는것이 매우 난감했으나 본 코드로 인해 상호연결의 유효성을 판단할수 있어서 
충분히 지속 연결 소켓을 만들수 있겠다.

   


하지만 위의 코드는 문제를 내포 하고 있다.
클라이언트로 받는 바이트를 1 씩 미리읽어 1바이트씩 이동 했다는것인데, 이것때문에 여럿 문제를 야기 한다.
이것의 해결책은 다음에 포스팅 하도록 한다.

그리고

if (client.GetStream().DataAvailable)
                    {

이 .. 문장도 문제가 있다.
Yamecoder 야매코더_
C# 2011.10.16 00:44

[User32.dll] 윈도우 위치 지정 하기



 
Created with colorer-take5 library. Type 'csharp'

using System;
using System.Windows;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;

namespace ProcessTEST
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        //user32.dll 을 임포트 한다
        [DllImport("user32.dll", SetLastError = true)]
        //MoveWindow 함수를 호출한다.
        internal static extern bool MoveWindow(IntPtr hwnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

        protected override void OnInitialized(EventArgs e)
        {
            //프로세스로 메모장을 열고 실행 한다
            Process proc = new Process();
            proc.StartInfo.FileName = "notepad.exe";
            proc.Start();

            //잠시 정지후에..
            Thread.Sleep(10);

            //위에서 실행시킨 프로세스의 윈도우 핸들을 얻는다.
            IntPtr id = proc.MainWindowHandle;
            //함수호출!
            MoveWindow(proc.MainWindowHandle, 2000, 0, 500, 500, true); 
            base.OnInitialized(e);
        }
    }
}

추가로 Process 에서 IntPtr 을 쉽게 얻을수 있는 아이디어,
Yamecoder 야매코더_
분류없음 2011.09.05 16:04

[C# , SMTP]구글 SMTP 로 메일 보내기





Gmail 계정을 이용해 별도의 메일 서버 없이 E 메일을 발송할수가 있다. 

아래는 이해를 돕기위해 변수 , 메서드를 나열하였다.(실 개발에서는 좀더 세련된 코드로...)

Created with colorer-take5 library. Type 'csharp'

private void SendMail()
        {
            //
            //필요한 정보 , id , pw 는 Gmail 계정을 입력한다.
            //
            String id = "****@gmail.com";
            String pw = "****";
            String from = "****@gmail.com";
            String mailto = "totototo@nate.com";

            String title = "TITLE2";
            String htmlStr = "<html><body><h1>My First Heading</h1><p>My first paragraph.</p></body></html>";
            //다중 첨부파일
            String[] attachFiles = new string[]{"c:/test.jpg" , "c:/test.txt"};


            //mail msg
            MailMessage msg = new MailMessage(from , mailto , title , htmlStr);
            msg.IsBodyHtml = true;
            msg.BodyEncoding = System.Text.Encoding.UTF8;
            msg.SubjectEncoding = System.Text.Encoding.UTF8;
            

            //tokenList
            List<string> userToken_list = new List<string>();
            userToken_list.Add(mailto);


            //attach file
            if (attachFiles != null)
            {
                foreach (string file in attachFiles)
                {
                    if (System.IO.File.Exists(file))
                    {
                        msg.Attachments.Add(new Attachment(file));
                        userToken_list.Add(file);
                    }
                }
            }
            //Array 형태로 바꿈
            String[] userToken = userToken_list.ToArray();

            //smtp 구글 설정
            SmtpClient sc = new SmtpClient("smtp.gmail.com", 587);
            sc.Credentials = new NetworkCredential(id, pw);
            sc.EnableSsl = true;
            sc.DeliveryMethod = SmtpDeliveryMethod.Network;
            sc.SendCompleted += new SendCompletedEventHandler(sc_SendCompleted);
            sc.SendAsync(msg, userToken);
                   
        }


결과  : 첨부파일 2개와 HTML 텍스트가 정상적으로 들어왔다.



 

++++ 추가 ++++
첨부파일을 바로 메일 본문에 삽입하기 (ContentId 지정!)

첨부파일은 바로 new Attachment(...) 를 하지말고 변수 인스턴스를 잡는다.

Attachment at = new Attachment(file , MediaTypeNames.Image.Jpeg);
at.ContentId = "ContentID0";
msg.Attachments.Add(at);


하고 HTML 에는 , <img  src="cid:ContentID0"> 처럼 'cid:' 를 지정하면 됨  

Yamecoder 야매코더_
C# 2011.08.22 17:30

[TwitPic 모듈] 트윗픽을 손쉽게 활용하자





사용법

소켓 IP : 로컬 (127.0.0.1)
소켓 포트 : 55667

명령전송 (헤더) : 256 바이트 헤더에

  "$ID:"+$id+"$PW:"+$pw+"$USERID:"+$userId+"$TEXT:"+$text; 

나머지 남는 바이트는 공백 " " 처리 를 하여 256 바이트를 채운후 256바이트 이후 JPG , PNG 포멧을 싣어 보낸다

제약사항 : 이미지파일이 4MB를 넘지 않을것, 같은 아이피로 시간당 500번 이상 포스팅 금지

* TEST Flash App 버튼 클릭시 테스트용 플래시 어플이 실행됨



Flash AS3 용 라이브러리 


활용법
 
var target : FileReference = event.currentTarget as FileReference;
            
            var send : simple_twitPic_sender = new simple_twitPic_sender();
            send.sendMsg(
                idTx.text, //id
                pwTx.text, //pw
                userTx.text, //userid
                text.text,//text
                target.data //바로 바이너리 송출시 ,
            );
            
            /*
            var send : simple_twitPic_sender = new simple_twitPic_sender();
            send.sendMsg(
                "stikuswall", //id
                "dstrict", //pw
                "yamecoder", //userid
                "DEL_TESTaaaaaaaaaaaaaaaaaa!",//text
                send.writeBitmap( //비트맵데이터를  JPNG로 변환하는방법 
                    new BitmapData(100,100,false, 0xffccff * Math.random()*100) //bitmapData
                )
            );*/


다운로드 :

Yamecoder 야매코더_
C# 2011.06.09 11:27

[SimpleFileWriter] AS3 에서 파일을 저장하자



기존 의 http://www.scripter.co.kr/entry/Simple-Text-Writer-V01-간편한-파일-쓰기-어플 를 업그래이드 해봤다.

예전에는 Text 만 되는 반면 이번꺼는 모든 As3 의 ByteArray를 죄다 기록할수 있다.

사용법

as3

 
package 
{
    import flash.display.BitmapData;
    import flash.utils.ByteArray;
    import jjongun.server.file_Socket_Server;
    import flash.display.Sprite;

    public class Main extends Sprite
    {
        public function Main()
        {
            var sp : Sprite = new Sprite();
            sp.graphics.beginFill(0xcc);
            sp.graphics.drawCircle(0, 0, 100);
            addChild(sp);
            
            //test
            var writer : file_Socket_Server = file_Socket_Server.getInstance();
            
            var data : BitmapData = new BitmapData(400, 400);
            data.draw(this);
            writer.writeFile("e:\test3.Png", writer.writeBitmap(data));
            
            
            var d : ByteArray = new ByteArray();
            d.writeUTFBytes("WOW!");
            writer.writeFile("e:/WOW.txt", d);
            
            
            var xml : XML = <root>AAA</root>;
            writer.writeFile("e:/test.xml", writer.writeText(xml.toXMLString()));
        }
    }
}

주의점은 경로를 적을때 "\" 를 적으면 에러난다.

관련 클래스는 첨부파일을 아래 "get AS3 file "에서 얻을수 있다.




* 버그수정 : 오버라이트시 파일바이트를 완전이 최신화 하지 못하는 버그가 있었다.
Yamecoder 야매코더_
C# 2011.03.10 14:37

[TCPSocket] 안전한 Socket 연결과 버퍼데이터를 설정한 데이터전송 (C# <-> As3)


소켓사용을 꺼려하는 이유중 하나는 연결의 지속성을 보장하기가 까다롭기 때문이다. 또한 그것을 서로 스로스 체킹

하는 코드를 작성하기가 번거럽기 때문이기도 하다.

하지만 생각을 바꾸어 왜? 소켓을 항상 연결시켜 놔야 할까? 물론 실시간 데이터전송 같은경우 , 즉 마우스 좌표에 따라 무었을 지속적으로 움직여야 한다거나 하는 실시간적인 반응이 필요한 경우로 생각할수 있겠다.

하지만 데이터의 전송, 어느 순간 상태의 알림 등등의 경우에는 연결을 지속적으로 유지해야 할 필요가 없다.
본 모델은 이미 

에서 사용하였고 지금까지 별 탈없이 사용한 모델을, UTF텍스트가 아닌 바이너리를  전송하는 경우로 생각하여 바꾸어 보았다.

목표는 
1) 예전에 철없던 시절의 소켓서버 ( http://www.scripter.co.kr/entry/socket-c-server-as3-client )의 비효율성을 타파하여 좀더 세련된 방법으로 소켓을 구성하는 법.

2) "1)"의 연속적인 개념으로, 지속적인 연결이 아닌 한방에 한번씩 연결하여 전송하고 연결을 종료하는 방법.

3)큰 파일을 무리없이 전송하기 위해 버퍼를 설정하여 끊어 읽어 기록하는 방법

을 정리해보겠다.


우선 간단한 순서도를 보면 이러하다.


c# 서버
using System;
using System.Windows;
using System.Net.Sockets;
using System.Threading.Tasks;
using System.IO;

namespace testEncoderRecieve
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
        }

        private Task ServerThread;
        private TcpListener server;
        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            ServerThread = new Task(startServerThreaed);
            server = new TcpListener(System.Net.IPAddress.Parse("127.0.0.1"),5555);
            //TcpListener를 생성하고, 서버 스레드가 시작되었다
            ServerThread.Start();
        }
        void startServerThreaed()
        {
            //서버를 시작시킨다.
            server.Start();

            //버퍼를 설정한다. 우선64바이트 만큼만...
            Byte[] buffer = new Byte[64];

            int testCount = 0;
            while (true)
            {
                //클라이언트를 대기한다. 클라이언트로 부터 접속신호가 있기 전까지 루프는 여기서 멈춤.
                TcpClient client = server.AcceptTcpClient();
                //클라이언트가 접속하고 스트림을 가져 온다.
                NetworkStream netStream = client.GetStream();
                //파일스트림을 생성하여 FileAccess.write로 한다.
                FileStream fs = new FileStream(@"d:\test" + testCount + ".png", FileMode.OpenOrCreate , FileAccess.Write);
                int i = 0;
                while ((i = netStream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    //여기서 정수i가 0보다 클때까지, 즉 끝까지 루프를 반복하며 정해진 버퍼만큼 기록한다.
                    fs.Write(buffer, 0, i);
                }
                //루프가 끝나면 모든 스트림을 종료하고 다시 대기상태로 돌아간다.
fs.Close(); netStream.Close(); client.Close(); ++testCount; } } } }



as3 클라이언트
package {
    import flash.events.Event;
    import flash.net.Socket;
    import flash.utils.ByteArray;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.media.Camera;
    import flash.media.Video;
    /**
     * @author superSc_PC
     */
     
    [SWF(width = "1000")]
    public class Main extends Sprite
    {
        private var cam : Camera;
        private var vid : Video;
        private var captureBitmap : Bitmap;
        
        private var socket : Socket;
        public function Main()
        {
            //필요한것들을 생성하며 캡쳐환경을 만든다.
            cam = Camera.getCamera();
            vid = new Video();
            vid.attachCamera(cam);
            captureBitmap = new Bitmap(new BitmapData(vid.width, vid.height));
            captureBitmap.x = vid.width;
            addChild(vid);
            addChild(captureBitmap);
            //화면을 클릭할때 마다 캡쳐를 한다.
stage.addEventListener(MouseEvent.CLICK , takePic); //소켓을 생성하고 연결을 잡을 이벤트를 선언한다. socket = new Socket(); socket.addEventListener(Event.CONNECT, connectFn); } //인코딩을 담을 바이트배열 변수 를 선언한다. private var captureByte : ByteArray; private function connectFn(event : Event) : void { //연결이 되었다. 간단한 유효성검사후 전송한다. if (captureByte != null && captureByte.length > 0) { socket.writeBytes(captureByte); socket.flush(); socket.close(); } //연결이 종료되었다. } private function takePic(event : MouseEvent) : void { captureBitmap.bitmapData.draw(vid); captureByte = PngEncoder.encode(captureBitmap.bitmapData); //화면이 클릭되고 캡쳐된 비트맵은 png로 인코딩된다. captureByte.position = 0; //바이트배열 포지션을 처음으로 돌려주고 //소켓을 연결한다. if(socket.connected == false) { //소켓이 연결되면 위에서 선언한이벤트에 의해 connectFn이 실행된다. socket.connect("localhost", 5555); } } } }


아직까지는 as3 에서 버퍼단위로 전송하는 writeByte의 기능은 없는듯하다. 버퍼를 이용하기 위해선
인위적으로 해더 정보를 보내서 서버에서 끝어 읽기 하는 알고리즘이 필요하다
Yamecoder 야매코더_
C# 2011.03.04 18:52

[XNA , WPF] XNA 에서 코드레벨로 WPF 생성하기




필요한 레퍼런스는
 
System.Windows.Presentaion
System.Xaml
PresentationCore
PresentationFramework

이고  필요한 using 은

using System.Threading;
using System.Windows;
using System.Windows.Controls;

되겠다.


Created with colorer-take5 library. Type 'csharp'
XNA , Game1.cs 중 일부

        Texture2D tex;
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            tex = Content.Load<Texture2D>("logo2");
            this.Window.Title = "currentThread :" + Thread.CurrentThread.ManagedThreadId;
            
            //[0] 새로운 wpf 어플을 생성하기 위해 새로운 스레드 생성 , 스레트타입은 STA
            Thread t = new Thread(startThread);
            t.ApartmentState = ApartmentState.STA;
            t.Start();
        }
        void startThread()
        {
            //[1] Application 객체를 선언하고 생성
            Application app = new Application();
            //[2] StartUp 이벤트를 건다.
            app.Startup += new StartupEventHandler(app_Startup);
            //[3] 그리고 시작!
            app.Run();
        }

        void app_Startup(object sender, StartupEventArgs e)
        {
            //[4] 새로운 윈도우를 생성한다
            Window win = new Window();
            win.Width = 300;
            win.Height = 300;
            win.Title = "currentThread :" + Thread.CurrentThread.ManagedThreadId;
            //[5] 새로운 윈도우를 표시한다
            win.Show();

            Button bt = new Button();
            bt.Content = "XNA 에서 WPF 생성��기";
            win.Content = bt;
        }

역시나 윈도우폼과 마찮가지로 STA 타입의 스레드가 필요하다.
그러나 윈폼과 Application 의 사용법이 다른점에 주의! (그냥 Application.Run 하면 안된다.)

또한 닷넷4.0의 경우 System.Xaml 을 필히 참조 시켜줘야 겠다. 
Yamecoder 야매코더_
XNA 2011.02.01 16:03

[C#] 현재 윈도우의 Top 핸들 얻기와 익스플로러로 타입캐스팅 하기


 이전글 [ http://www.scripter.co.kr/entry/C-활성윈도우-이름-과-핸들-알아내기-와-익스플로러-주소값-알아내기 ]
는 나름대로 의미가 있었지만 딱 필요한 익스플로러만의 정보를 알아내기 위해서 아래와 같이 심플한
코딩이 가능하다.

        private void getWin()
        {
            //[0] 현재의 윈두우 핸들 얻기
            int handle = GetForegroundWindow();
            

            //[1] SHDocVw 의 브라우저에서 현재부라우져들 검출 
            foreach (SHDocVw.WebBrowser wb in new SHDocVw.ShellWindowsClass())
            {
                //[2] 각각의 브라우져 핸들과 현제Top의 핸들 검출
                if (wb.HWND.Equals(handle))
                {
                    //[3] 검출된 브라우져의 타입캐스팅
                    InternetExplorer ie = wb as InternetExplorer;
                    _name = ie.Name;
                    _resultURL = ie.LocationURL;
                    
                }
            }
        }

핸들을 이용한다 (HWND) 는거 , 좀더 조사할 필요가 있다.
Yamecoder 야매코더_
C# 2011.02.01 10:20

[C#] 활성윈도우 이름 과 핸들 알아내기 와 익스플로러 주소값 알아내기




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

//[0] 필요한 DLL 추가 SHDocVw는 윈도우에서 찾기
using SHDocVw; 
using System.Runtime.InteropServices;

namespace LINK_HELPER2
{
    public partial class MainWindow : Window
    {
        TRACE.TraceDele trace = TRACE.getTrace;
        bool isCk = false;

        //[1] user32.dll 의 필요한 함수 선언
        [DllImport("user32.dll")]
        static extern int GetForegroundWindow();
        [DllImport("user32.dll")]
        static extern int GetWindowText(int hWnd, StringBuilder text, int count);


        public MainWindow()
        {
            InitializeComponent();

            //[2] 체크박스 이벤트 선언
            checkBox1.PreviewMouseDown += new MouseButtonEventHandler(checkBox1_MouseDown); 
            check();
        }
        //[3] 체크박스의 핸들러 [검색의 실행 / 대기]  
        void checkBox1_MouseDown(object sender, MouseButtonEventArgs e)
        {
            if (!checkBox1.IsChecked == true)
                isCk = true;
            else
                isCk = false;
        }


        //[4]체크 시작
        private void check()
        {
            System.Timers.Timer t = new System.Timers.Timer();
            t.Interval = 1000;
            t.Elapsed += (s, e) =>
            {
                if (isCk == true)
                {
                    ckIE();
                    getWindow();
                }
            };
            t.Start();
        }

        //[5] 윈도우의 타이틀 얻기
        void getWindow()
        {
            const int nChars = 256;
            int handle = 0;
            StringBuilder Buff = new StringBuilder(nChars);
            handle = GetForegroundWindow();
            if (GetWindowText(handle, Buff, nChars) > 0)
            {
                trace("caption ", Buff.ToString());
                trace("handle", handle.ToString());
            }
        }

        //[6] 익스플로러의 이름과 현제 URL 얻기
        private void ckIE()
        {
            foreach (InternetExplorer ie in new ShellWindowsClass())
            {
                trace(ie.Name, ie.LocationURL);
            }
            trace("--->");
        }
    }
}


@p.s
익스플로러에 검출에 "Windows 탐색기" 도 걸린다.
Yamecoder 야매코더_
C# 2011.01.31 22:40

[Shell32.DLL] *.LNK , *.URL 분석하기





/**************************LNK파일 모양******************************/
L        ?      F?       ?|邂栗S執네??|邂栗 t                    W P???i↖ +00? /E:\                   l 1     ?? PROGRA~1  T 絶?뢒??*   퉠                   P r o g r a m   F i l e s   ( x 8 6 )   X 1     ?? ARTHRO~1  @ 絶????*  
                   A r t h r o p o d   d 2  t ??  ARTHRO~1.EXE  H 絶????*   U
                  A r t h r o p o d . e x e      d            4       c         Kd끘   새 볼륨 E:\Program Files (x86)\Arthropod\Arthropod.exe  (      ?   1SPS?XF퍵8C샜?쁬?        `     쟚       uf15-pc                         V솝??? $?^                V솝??? $?^   
/********************************************************************/



/*********************URL 파일 모양 ***********************************/
[DEFAULT]
BASEURL=http://cafe.naver.com/gosusi.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=4109
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
[InternetShortcut]
URL=http://cafe.naver.com/gosusi.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=4109
IDList=
IconFile=http://cafe.naver.com/favicon.ico
IconIndex=1
/**********************************************************************/


처럼 LNK는 바이너리 타입이고 URL은 텍스트타입이다.

코드를 보면,




Created with colorer-take5 library. Type 'csharp'

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.IO;
using Shell32;
using System.Reflection;

namespace LnkASMB2
{
    public partial class MainWindow : Window
    {
        TRACE_Lib.TRACE.TRACE_DELE trace = TRACE_Lib.TRACE.getTrace;
        public MainWindow()
        {
            InitializeComponent();

            //[0]
            this.AllowDrop = true;
            this.Drop += new DragEventHandler(MainWindow_Drop);
        }

        void MainWindow_Drop(object sender, DragEventArgs e)
        {
            //[1]
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                //[2]
                string[] files = e.Data.GetData(DataFormats.FileDrop, true) as string[];
                FileInfo info = new FileInfo(files[0]);
                
                //[3]
                if (info.Extension == ".lnk" || info.Extension == ".LNK")
                    AssembleLNK(files[0]);
                else if (info.Extension == ".url" || info.Extension == ".URL")
                    AssembleURL(files[0]);
                else
                    MessageBox.Show("모르는파일입니다.");
            }
        }

        //[4]
        void AssembleLNK(string _path)
        {
            //[5]
            Shell shl = new Shell();
            //[6]
            Folder dir = shl.NameSpace(System.IO.Path.GetDirectoryName(_path));
            //[7]
            FolderItem item = dir.Items().Item(System.IO.Path.GetFileName(_path));

            //[8]
            List<object> itemPis = new List<object>();
            itemPis.Add(new { str = "단축아이�� 바이너리" });
            itemPis.Add(new {item.Application});
            itemPis.Add(new {hash = item.GetHashCode()});
            itemPis.Add(new {item.IsBrowsable});
            itemPis.Add(new {item.IsFolder});
            itemPis.Add(new {item.IsLink});
            itemPis.Add(new {item.Path});
            itemPis.Add(new {item.Name});
            itemPis.Add(new {item.Parent});
            itemPis.Add(new {item.Size});
            itemPis.Add(new {item.Type});

            //[9]
            ShowText(itemPis);
        }

        //[10]
        void AssembleURL(string _path)
        {
            TextReader tr = new StreamReader(_path);
            String tempLine = null;
            String result = null;
            while ((tempLine = tr.ReadLine()) != null)
            {
                //[11]
                if (tempLine.IndexOf("URL=") > -1)
                {
                    result = tempLine.Substring(4);
                }
            }
            //[12]
            textBox1.Text = "";
            textBox1.Text = "인터넷바로가기" + Environment.NewLine + result;
        }

        void ShowText(List<object> itemPis)
        {
            textBox1.Text = "";
            foreach (var o in itemPis)
            {
                textBox1.Text += o.ToString() + Environment.NewLine;
            }
        }
    }
}

 
주석
[0] : 드래그 드롭 설정과 이벤트
[1] : 만약 드롭파일의 유효성검사
[2] : 드롭된 파일위치 검출 과 FileInfo 생성
[3] : 확장자 식별과 예외처리
[4] : LNK 분석 (바이너리)
[5] : System32 폴더에서 Shell32.dll 을 가져와 참조추가 하여 사용
[6] : 디렉토리 검출
[7] : FolderItem 검출
[8] : 속성들의 리스트화
[9] : 출력
[10] : URL 분석 (텍스트)
[11] : 해당 줄에 "URL=" 검출 <*>
[12] : 출력!


주석 [11]은 윈도우의 경우이고 , MacOS계열에서 넘어오는것은 그냥 ( http://www.abc.com )꼴이다.
Shell32.dll 을 이용하면 윈도가 생성한 대부분의 파일을 분석할수 있다.
하지만 COM 객체라서 그런지 기본코드레벨로 리플렉션을 할수 없어 해당 속서을 파악할수 없다( PropertyInfo[] )
[ 파일속성관련 포스트 :  http://www.scripter.co.kr/entry/any ]
Yamecoder 야매코더_
C# 2011.01.25 13:43

[new Thread in new Form] 새로운 쓰레드 안에 새로운 윈도우폼

무작정 쓰레드를 생성하여 폼을 생성한다면... 
 
Thread t2 = new Thread(sample);
        t2.Start();
...
        private void sample()
        {
            Form n = new Form();
            n.Show();
        }
바로 폼이 깜빡 거리고 만다. 해당쓰레드가 바로 죽기 때문이다.
새로운 폼은 새로운 어플리케이션으로 생성해야 한다.
 
 
 
 
 
Thread t2 = new Thread(sample);
        t2.Start();
...
        private void sample()
        {
            //Form n = new Form();
            //n.Show();
Application.Run(new Form2());
        }
 
 주의할점은 Application.Run 앞에 모든 명령이 와야 한다.
해당 쓰레드는 Application을 기점으로 돌고 있기 때문에 Application 뒤에 명령이 온다면,
Application 이 종료된다음에 실행된다. while 문과 같다고 생각하면 되겠다.
 
Dispose 를 구현한다면 Application 뒤에 오는것도 나쁘지 않겠다.
 
ex> 
 
Application.Run(...);
Consol.writeLine("해당 어플리케이션이 종료되었습니다.");
 
 
 
 
 
더욱 안전한 방법을 원한다면 
BackgroundWorker 를 사용하는 방법도 있다.
 
보기
 
구현방법은 역시 같다.
Yamecoder 야매코더_
C# 2011.01.19 17:18

[AxShockwaveFlashObjects] AS3 in C#

 

 

http://www.scripter.co.kr/entry/FlashExternal-c-안에-as3-AVM2-넣기

에서 같은주제를 아주 예전에 다루었지만 내용이 너무 부실하고, 철없었기 때문에 보강을 해야겠다.

사실 구글에 많이 올라와 있는 "AxShockwaveFlashObjects" 관련글들을 그대로 따라했다가는

이유도 모르는 FileNotFoundException 이 나올것이다.

그런 분들은 아래의 DLL 을 사용하기 바란다 .










코드를 살펴 보겠다.



c#



Created with colorer-take5 library. Type 'csharp'

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using TRACE_Lib;

using Flash.External;
using AxShockwaveFlashObjects;
using System.IO;
using System.Collections;

namespace FlashTEST_1
{
    public partial class Form1 : Form
    {
        public TRACE.TRACE_DELE trace = TRACE.getTrace;
        public Form1()
        {
            InitializeComponent();
        }
        //[0]
        private AxShockwaveFlash flash;
        private ExternalInterfaceProxy proxy;
        
        protected override void OnLoad(EventArgs e)
        {
            //[1]
            flash = new AxShockwaveFlash();
            this.Controls.Add(flash);
            //[2]
            string swfPath = Environment.CurrentDirectory + Path.DirectorySeparatorChar+ "TestCS.swf"; 
            flash.LoadMovie(0, swfPath);
            flash.Width = 500;
            flash.Height = 400;
            //[3]
            proxy = new ExternalInterfaceProxy(flash);
            //[4]
            proxy.ExternalInterfaceCall += new ExternalInterfaceCallEventHandler(proxy_ExternalInterfaceCall);

            base.OnLoad(e);
        }

        object proxy_ExternalInterfaceCall(object sender, ExternalInterfaceCallEventArgs e)
        {
            //[5]
            string name = e.FunctionCall.FunctionName;
            object[] args = e.FunctionCall.Arguments;

            if (name == "ready")
            {
                trace("#", name, (args[0] as ArrayList)[0], (args[0] as ArrayList)[1]);
            }
            //[6]
            if (name == "testCall")
            {
                //[7]
                TxReceive.Text += (args[0] as ArrayList)[0].ToString() + Environment.NewLine;
            }
            //[8]
            return null;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //[9]
            proxy.Call("CallAS3", TxSend.Text);
        }
    }
}
 
 
/* [0] : Form 으로 플래시를 불러오기위해서는 AxShockwaveFlash 라는 윈도우 컨트롤과 
*       그것을 제어하는 ExternalInterfaceProxy 를 사용하여야 정확하게 AS3과 통신할수 있다.
*
* [1] : flash 컨테이너를 선언하고 메인폼에 붙였다.
*
* [2] : TestCS.swf 의 위치를 획득하여 LoadMovie 하였다.
*
* [3] : 프록시를 선언하여 플래시의 ExternalInterface 과 연결하기로 하였다.
 *
 * [4] : 프록시에 이벤트를 선언하여 플래시에서 오는 신호를 받아 들인다.  *
 * [5] : ExternalInterfaceCallEventArgs 의 멤버로 FunctionCall에서  *       FunctionName 과 Arguments를 얻을수 있다.  *      
 * [6] : "testCall" 은 AS3 코드에서 보면 알겠지만 "Call("testCall" , input.text);" 처럼
 *       서로의 이름이 같게 하여 원하는 값을 추출 한다. 이는 c# 이 값을 받는 상황 과 보내는 상황
*       모두 적용 된다.
*        * [7] : 플래시에서 "...args" 형으로 매개변수를 받는것이 c# 으로 넘어오면 args[0] 로 된다.  *       그리고 그타입은 ArrayList 이다
 *       ※ AS3 의 Array는 배열의 타입을 따로 지정하지 않는 ArrayList 이다.
 *      
 * [8] : 이유는 모르겠지만 라이브러리 상의 이벤트 델리게이트 반환타입이 오브젝트 이어서
 *       불가피하게 return 하였다.  *        * [9] : "[6]"참고 , 플래시로 값을 보낸다.  *  * */
 
 
 
 
그다음은..
AS3






Created with colorer-take5 library. Type 'csharp'

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.events.TimerEvent;
    import flash.external.ExternalInterface;
    import flash.system.fscommand;
    import flash.text.TextField;
    import flash.text.TextFieldType;
    import flash.utils.Timer;
    
    public class TestCS extends Sprite
    {
        private var tx: TextField;
        private var input : TextField;
        private var bt : Sprite;
        public function TestCS()
        {
            //[0]
            //view..
            tx = new TextField();
            addChild(tx);
            tx.border = true;
            tx.multiline = true;
            tx.width = stage.stageWidth;
            tx.height = stage.stageHeight-50;
            tx.text = "string!";
            
            input = new TextField();
            input.type = TextFieldType.INPUT;
            input.x=  0 ; 
            input.y = tx.y + tx.height + 10;
            input.width = 200;
            input.border = true;
            input.height = 30;
            input.text = "Hellow C#! Iam AS3";
            addChild(input);
            
            bt = new Sprite();
            bt.graphics.beginFill(0x0);
            bt.graphics.drawRect(0,0,100,30);
            bt.x = input.x + input.width + 30;
            bt.y = input.y;
            bt.buttonMode = true;
            addChild(bt);
            
            //[1]
            //Event
            addEventListener(Event.ADDED_TO_STAGE , ready);
            bt.addEventListener(MouseEvent.CLICK , bt_call);
            
            //[2]
            //callback
            CallBack("CallAS3" , callBackFromCSharp);
        }
        
        
        //EventHandler & CallbackMethod
        private function ready(e:Event = null):void
        {
            Call("ready" , stage.stageWidth , stage.stageHeight);
        }
        
        //[3]
        private function callBackFromCSharp(msg : String):void
        {
            tx.text += " \n" + msg;
        }
        
        //[4]
        private function bt_call(e:MouseEvent):void
        {
            Call("testCall" , input.text);
        }
        
        
        //[5]
        //Exception Local Error
        private function Call(ParamName : String ,...args):void
        {
            try{
                ExternalInterface.call(ParamName , args);
            }catch(e:Error){tx.text += e.toString() +"\n";}
        }
        private function CallBack(ParamName : String , CallBack:Function):void
        {
            try{
                ExternalInterface.addCallback(ParamName , CallBack);
            }catch(e:Error){}
        }
    }
}
/**
 * [0] : 화면구성에 필요한 요소들을 생성 , 배치 하였다.
 *
 * [1] : 간단한 문자열을 보낼 버튼 이벤트와 초기화 이벤트를 작성하여 상황에 맞게 c# 으로 값을
 *       보낼것이다.
 *       그러나 초기화 이벤트 (Event.ADDED_TO_STAGE) 는 c# 에서 동작하지 않는다.(?왜그런지..)
 *
 * [2] : c# 에서 올 신호를 받는 콜백을 선언하였다.
 *
 * [3] : "[2]" 를 받는 메서드
 *
 * [4] : 버튼을 누르면 간단히 C# 으로 문자열을 보내는 이벤트 핸들러 "[1]" 참고
 *
 * [5] : 코드를 이처럼 처리한 이유는 swf 를 감싸는 무언가가 없는 상황에서 ExternalInterface 는 에러를 발생시킨다.
 *
 * */


Yamecoder 야매코더_
C# 2011.01.17 18:39

[.Net Profiler] ANTS Memory Profiler 사용해보기





현재 6버전까지 나왔다.

지금은 5버전 을 테스트 해보겠다.






메뉴 항목에서 .net Executable 을 선택하고 대상을 찾고 스타트 버튼을 누르자




그러면 실행과 동시에 프로파일러가 실행되고

상단에 사진기 모양의 아이콘 , Take Memory SnapShot 을 클릭한다.






그러면 익숙한 프로파일링 장면이 나올것이다.

여기서 Grop By namespace 를 체크하면

좀더 편리하게 객체를 조사할수 있다.




그럼 한번 객체를 생성하여 보자 , 정말 프로파일링이 되는지 ...



객체를 생성하고 스냅샷을 찍었더니 정말 Texture2d 객체의 개수가 늘어났다. 그에 따른 메모리 바이트도 표시되고
이전 스냅샷과 비교하여 얼마나 늘었는지 줄었는지도 표로 금방 알수 있다.

화살표로 되어 뺀부분은 객체를 삭제 하였을때 이다. 역시 대상객체의 개수가 줄었으며 이러한 방법으로 메모리관리를 할수 있다.





부가적으로 아래와 같은 ., 클래스를 추적하는 기능도 있더라...

사실 이러한 실시간 프로파일러를 VS2010 안에서 찾을려고 오랜시간 노력했지만 찾지 못했고 ,

MSDN 에서 답을 찾았다.
http://social.msdn.microsoft.com/Forums/ko-KR/visualcsharpko/thread/ff4afa62-123a-4311-a609-9eb210b70145
(강보람 MVP님 ㄳ ! )




Yamecoder 야매코더_
C# 2011.01.16 00:44

[LINQ _ XML] 간략한 LINQ to XML 사용법


샘플 XML
<?xml version="1.0" encoding="utf-8" ?>
<root>
  <config>
    <Rootposition x="100" y="100"/>
  </config>

  <adData>
    <content name="samsung">
      <keyVisual x="0" y="0">http://www.samsung.com/us/boosted</keyVisual>
      <mov x="100" y="120">SAMSUNG MOV</mov>
    </content>

    <content name="hyundai">
      <keyVisual x="0" y="0">http://www.hyundai.com/kr/main.aspx</keyVisual>
      <mov x="20" y="200">HYUNDAI MOV</mov>
    </content>

    <content name="lg">
      <keyVisual x="20" y="0">http://www.lg.co.kr/</keyVisual>
      <mov x="330" y="300">LG MOV</mov>
    </content>
  </adData>
</root>
 
 
 
C# [Linq _ XML]
 
Created with colorer-take5 library. Type 'csharp'

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Xml.Linq;
using System.Text;
using System.Windows.Forms;

namespace LINQ_XML_test1
{
    public partial class Form1 : Form
    {
        public TRACE.TraceDele trace = new TRACE.TraceDele(TRACE.getTrace);
        public Form1()
        {
            InitializeComponent();
        }

        protected override void OnLoad(EventArgs e)
        {

            //간단��게 xml 문서를 로드 한다.
            XElement xe = XElement.Load("Sample.xml");

            //Descendants는 Child ,  즉 XML.Child( "adData" ).Child( "adData" ) �� 논리로 생각��면 ��겠다.
            //이로서 검출될 item 의 범위를 정한다.
            //
            //select 로 xmlQuery 에 반환될 형식을 정한다.
            //본 코드는 리스트화 하기위해 'SampleResult'라 하였지만
            //익명메서드 꼴인 'new {...}' 을 사용하거나 item을 바로 반환 하여도 동작가능하다.
            var xmlQuery = from item in xe.Descendants("adData").Descendants("content") 
                           select new SampleResult
                           {
                               //Element 일경우 Value를 반환지 않으면 xml 태그가 그대로 반환된다.
                               KeyVisual = item.Element("keyVisual").Value,
                               mov = item.Element("mov").Value,
                               //Attribute 일경우 String 으로 반환기때문에 적절한 타입케스팅이 필요하다.
                               movPosition = new Point((int)item.Element("mov").Attribute("x") , (int)item.Element("mov").Attribute("y"))
                           };

            //결과를 담을 리스트
            List<SampleResult> sList = new List<SampleResult>();
            foreach (var result in xmlQuery)
            {
                sList.Add(result);
                trace(result.mov, "###", result.KeyVisual , "###" ,result.movPosition);
            }
            base.OnLoad(e);
        }
    }

    //샘플리스트 클래스
    class SampleResult
    {
        public String KeyVisual { get; set; }
        public String mov { get; set; }
        public Point movPosition { get; set; }
        public override string ToString()
        {
            return KeyVisual + " " + mov +" " + movPosition;
        }
    }
}
Yamecoder 야매코더_
tags : c#, LINQ, XML
C# 2011.01.10 18:03

[Zxing , QR Sample ] C# 에서 QR 라이브러리 사용하기





실버라이트 용 QR 라이브러리도 코드플렉스에 있지만.. 요걸 사용하고 싶었다 .

그런데 요놈은 c# 용 레퍼런스가 아무것도 없었다 . 자바와 ios 는 잘되어 있던데 .,

그래서 AS3 용 코드를 보고 어영부영 따라해 보았다.










using
System; using System.Drawing; using System.Windows.Forms; using AForge.Video.DirectShow; using AForge.Controls; using System.Collections; using com.google.zxing; using com.google.zxing.common; using com.google.zxing.qrcode; using trace; namespace Xing_TEST { public partial class Form1 : Form { public static traceDele trace = new traceDele(traceCS.traceMethod); public Form1() { InitializeComponent(); } //aforge player private VideoSourcePlayer player; //render Data private Bitmap captureData; //render Region private Rectangle captureBound; //renderTimer private Timer timer; //qr member private Reader reader; private Hashtable hint; protected override void OnLoad(EventArgs e) { //aforge initialize player = new VideoSourcePlayer(); player.Width = 320; player.Height = 240; FilterInfoCollection device = new FilterInfoCollection(FilterCategory.VideoInputDevice); VideoCaptureDevice cam = new VideoCaptureDevice(device[0].MonikerString); player.VideoSource = cam; player.Start(); this.Controls.Add(player); //captureData initialize captureBound = new Rectangle(player.Location.X , player.Location.Y , player.Width+100, player.Height); captureData = new Bitmap(player.Width, player.Height); Graphics g = Graphics.FromImage(captureData); //QR initialize reader = new QRCodeReader(); hint = new Hashtable(); hint.Add(DecodeHintType.POSSIBLE_FORMATS, BarcodeFormat.QR_CODE); //render timer initialize timer = new Timer(); timer.Tick += new EventHandler(timer_Tick); timer.Interval = 30; timer.Start(); base.OnLoad(e); } void timer_Tick(object sender, EventArgs e) { //capture DrawToBitmap(captureData, captureBound); pictureBox1.Image = captureData; //QR processing RGBLuminanceSource source = new RGBLuminanceSource(captureData, captureData.Width, captureData.Height); BinaryBitmap img = new BinaryBitmap(new GlobalHistogramBinarizer(source)); Result result = null; try { //QR success result = reader.decode(img, hint); } catch{} if (result == null) { //QR fail label1.Text = "no decode!"; } else { //QR Success label1.Text = result.Text; label2.Text = result.BarcodeFormat.ToString(); } } //close protected override void OnClosed(EventArgs e) { trace("Close!"); timer.Stop(); player.SignalToStop(); player.WaitForStop(); base.OnClosed(e); } } }
Yamecoder 야매코더_
tags : c#, QR, Zxing
C# 2011.01.07 18:24

[XNA on TUIO] CCV 1.4 <- TUIO -> XNA


.


CCV1.4 가 업데이트 됬다길래 , 성능도 시험 해볼겸사 , 해서 보니, 집에 있는 대충의 물건만으로도 멀티터치를 구현할수 있겠거니 하는 생각이 들었다.

웹캠이 필요했는데 , 마침 , 세계최강의 가정용 웹캠 마이크로 소프트 시네마 ! 를 ,, 적외선캠으로 만들기에는 너무 아까웠다 ,
그래서 적외선 말고도 강력하게 대비를 줄수 있는 물건을 생각하다가, 한번도 열어보지 않았던 연봉계약서, 검은 봉투와 대충 공책 짤라서 만든 흰색 종이 사각형으로 카메라 설정 조금 만져주고 하니, 별 손색업는 멀티포인트 테스트 장비가 되었다.






c# TUIO 라이브러리 :

간단한 tuio 클라이언트 사용법은 ..



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TUIO;
using Microsoft.Xna.Framework;
/*
 * CCV 에서 넘어온 좌표를 리턴하는 클래스 ;
 * 작성자 : superSc , Yamecoder , jjongun 
*/

namespace TEST_XNA_TUIO
{
    //TuioListener 를 상속하고 , ,
    public class XNATuioListener : TuioListener
    {
        //TuioClient 를 사용한다;.
        private TuioClient clinet;
        private Point point;
        private int stageWidth;
        private int stageHeight;

        public XNATuioListener(int _stageWidht , int _stageHeight)
            :base()
        {
            clinet = new TuioClient();
            //클라이언트와 리스너를 연결하고 ; ,
            clinet.addTuioListener(this);
            //접속을 한다.
            clinet.connect();

            stageWidth = _stageWidht;
            stageHeight = _stageHeight;
            point = new Point();
        }



        #region TuioListener &#47716;&#48260;
        void TuioListener.addTuioObject(TuioObject tobj)
        {
        }

        void TuioListener.updateTuioObject(TuioObject tobj)
        {
        }

        void TuioListener.removeTuioObject(TuioObject tobj)
        {
        }

        void TuioListener.addTuioCursor(TuioCursor tcur)
        {
        }

        void TuioListener.updateTuioCursor(TuioCursor tcur)
        {
            point.X = tcur.getScreenX(stageWidth);
            point.Y = tcur.getScreenY(stageHeight);
        }

        void TuioListener.removeTuioCursor(TuioCursor tcur)
        {
        }

        void TuioListener.refresh(TuioTime ftime)
        {
        }
        #endregion

        public void disconnect()
        {
            clinet.disconnect();
        }

        public Point getPoint
        {
            get { return point; }
        }
    }
}
 
상속 구현된 인터페이스를 보면 알겠지만 , tuio 정보들을 모두 수집할수 있다 ,

이를 비동기적으로 컨트롤 할 구조만 완성되면 XNA 를 이용하요 멀티터치 컨텐츠를 쉽고 강력하게 만들수 있다.

참고 : 네이버 XNA 카페

//

스케일 구현이나, 다중 포인터 생성은 , 다음에 , .. 금요일엔 한없이 한가하고 개을러 지다가  , 일요일저녁만 되면 주말을 알차게 활용못한 내자신이 부끄러워 지고 ,이제서야 조급해 지지만 이미 시계는 월요일 새벽 - - ;
또한 , 그것은 break 업는 무한 while 루프 .
Yamecoder 야매코더_
tags : c#, CCV1.4, nui, TUIO_LIB, XNA
XNA 2010.12.18 21:13

[c#] 익명타입의 (열거)배열

 

 

생각에 시작은 이러하다 .

 

 

예를 들어 AS3에 Tweener 의 일반적인 사용법을 보면

 

Tweener.to( targetObject , 1 , { x : 100 , y : targetObject.y + 100 , rotation : 100 , scale : 1.2 }) ;

Tweener.to( ColorMatrix , 2 , { r : 2.32 , g : 32.12 , b : –42.01 , a : 0.5 });

대부분이 요러한 모양이다 .

 

첫째 줄을 해석하면 ,

 

“targetObject 를 1초 동안 x좌표를 100으로 , y 좌표를 100만큼더 , 회전을 100도 , 스케일을 20% 키워라.”

 

가 되겠고 ,

 

“둘째 줄은 컬러매트릭스를 2초동안 , 빨강을 2.32 , 초록을 32.12 , 파랑을 –42.01 , 알파를 50% 만큼 해라 . “

 

이처럼 짧고도 가독성 있는 코드를 사용한다 .

 

이처럼 C# 에서 도 비교적 짧고 가독성 있는 트윈 클래스를 만들기 위해 , { , } 에 있는 속성들을 취합하여 열거하는 기능이

필수적으로 필요 하다.

C# 에서 이와 가장 사용성으로 비슷한 것은 익명 메서드 이고 이를 취합하여 적절히 이용하려 한다.

그러나 ..

익명타입들을 배열이나 컬렉션에 넣기 위해 Object 로 캐스팅 해버리면 익명 타입안에 속성에 접근을 할수 없다.

 

 

이것은 분명 동적성향을 많이 가지고 있는 AS3 의 Object 와 다른것이다.

 

하지만 불가능한것은 아니니 ,,

 

해답은 리플렉션을 이용하는것이다.

 

 

 

          //
          // 기본
            //

            
            //익명타입 생성
            var a = new { q1 = 123 , q2 = 4345};
            
            //타입추출
            Type t = a.GetType();

            //GetProperties는 PropertyInfo라는것의 배열 형태이다.
            PropertyInfo[] pi = t.GetProperties();

            //루프
            foreach (PropertyInfo p in pi)
            {
                //출력! 
                Console.WriteLine(p.Name + "   " +p.GetValue(a , null));
            }




          //
          // 응용
            //


            //오브젝트 배열 생성
            List<Object> list = new List<object>();

            //익명타입�� 추가 (Add)
            list.Add(new { a1 = 123, a2 = 234 });
            list.Add(new { b1 = 345, b2 = 567 });

            //list를 foreach 루프로 돌리고..
            foreach (Object o in list)
            {
                //타입을 뽑아낸다.
                Type ot = o.GetType();

                //ot 안에 GetProperties는 PropertyInfo라는것의 배열 형태이다.
                //역시 foreach 루프
                foreach (PropertyInfo p in ot.GetProperties())
                {
                    //출력 ~
                    Console.WriteLine("-> " +p.Name + "   " + p.GetValue(o , null));
                }
            }

 

 

이로서 익명타입을 열거 할 수 있게 되었다.
참고 :: http://stackoverflow.com/questions/1203522/how-to-access-property-of-anonymous-type-in-c

Yamecoder 야매코더_
C# 2010.12.06 17:59

[c#] 간단한 Generic List

    public class GenericList<T>
    {
        private class Node
        {
            private Node next;
            private T data;
            public Node(T t)
            {
                next = null;
                data = t;
            }
            public Node Next
            {
                get { return next; }
                set { next = value; }
            }
            public T Data
            {
                get { return data; }
                set { data = value; }
            }
        }

        private Node head;
        public GenericList()
        {
            head = null;
        }

        public void Add(T t)
        {
            Node n = new Node(t);
            n.Next = head;
            head = n;
        }

        public IEnumerator<T> GetEnumerator()
        {
            Node current = head;
            while (current != null)
            {
                yield return current.Data;
                current = current.Next;
            }
        }
    }

 

private 클래스 Node 와 그를 이용한 IEnummerator 구현 –> 제네릭 리스트 구현

 

참고 : (미친바바’s)  http://blog.naver.com/baba1092?Redirect=Log&logNo=130093943245

Yamecoder 야매코더_
C# 2010.12.06 11:31

[C# ,쉬운 이터레이터 만들기] Yield 키워드 간단히 개념잡기





  1.         public IEnumerable TestEnum1()
  2.         {
  3.             yield return "q1";
  4.             yield return "q2";
  5.             yield return "q3";
  6.             yield return "q4";
  7.         }
  8.  
  9.         public IEnumerable TestEnum2()
  10.         {
  11.             for (int i = 0; i < 100; ++i)
  12.             {
  13.                 if (i == 50)
  14.                     yield break;
  15.  
  16.                 yield return i;
  17.             }
  18.         }
  19.  
  20.         /****실행****/
  21.  
  22.         foreach (var item in TestEnum1())
  23.             Console.WriteLine(item);
  24.  
  25.         foreach (var item in TestEnum2())
  26.             Console.WriteLine(item);


위의 코드에서 보면 , IEnumerable 를 리턴 하는 키워드가  yield 라는 것을 알수 있다 .

그리고 루프롤 돌렸을때 , 결과는 를 리턴하는 순서로 출력 된다.

yield  뒤에는 return 또는 break 도 쓸수 있다 (14번째 라인 참고 )
Yamecoder 야매코더_
tags : c#, IEnumerable, yield
C# 2010.12.05 00:22

[socket] c# server , as3 client


pc1 ( server ): c# (windows 7)








pc2 ( client ) : AS3 (windows xp)



c# code (partial)



Created with colorer-take5 library. Type 'csharp'

/*
 * SharpDevelop으로 작성��었습니다.
 * 사용자: jjongun
 * 날짜: 2010-02-09
 * 시간: ��전 9:05
 * 
 * 
 */
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Net.Sockets;
using System.Net;
using System.IO;
using System.Diagnostics;
using System.Timers;


namespace testServer3
{
    /// <summary>
    /// Description of MainForm.
    /// </summary>
    public partial class MainForm : Form
    {
        public MainForm()
        {
            //
            // The InitializeComponent() call is required for Windows Forms designer support.
            //
            InitializeComponent();
            
            //
            // TODO: Add constructor code after the InitializeComponent() call.
            //
        }
        private delegate void serverMrgDele(string str);
        private System.Timers.Timer catchClient;
        private System.Timers.Timer readTimer;
        private IPAddress address;
        private Int32 port;
        private TcpListener server;
        private serverMrgDele mrg;
        private TcpClient client;
        private StreamWriter writer;
        private StreamReader reader;
        private NetworkStream stream;
        
        private Thread serverThread;
        private Thread checkThread;
        private Thread readThread;
        void ConnectBtClick(object sender, EventArgs e)
        {
            if(ipTx.Text == "")
                ipTx.Text = "127.0.0.1";
            if(portTx.Text == "")
                portTx.Text = "1000";
            try{
                address = IPAddress.Parse(ipTx.Text);
                port = Convert.ToInt32(portTx.Text);
            }catch(FormatException fe)
            {
                Trace.WriteLine(fe);
                ipTx.Clear();
                portTx.Clear();
            }
            
            mrg = new serverMrgDele(traceBox.AppendText);
            
            Thread serverThread = new Thread( new ThreadStart(startServer));
            readThread = new Thread(new ThreadStart(readClinet));
            checkThread = new Thread(new ThreadStart(checkClinetStatus));
            serverThread.Start();
        }
        
        //thread1
        private void startServer()
        {
            server = new TcpListener(address , port);
            Invoke(mrg , "start" + Environment.NewLine);
            server.Start();
            client = server.AcceptTcpClient();
            Invoke(mrg , "client connect" + Environment.NewLine);
            stream = client.GetStream();
            
            writer = new StreamWriter(stream);
            
            readThread.Start();
            checkThread.Start();
        }
        
        //thrad2
        private void readClinet()
        {
            reader = new StreamReader(stream);
            readTimer = new System.Timers.Timer();
            readTimer.Elapsed+= new ElapsedEventHandler(readTimer_Elapsed);
            readTimer.Interval=100;
            readTimer.Start();
        }
        
        void readTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            Invoke(mrg , reader.ReadLine() + Environment.NewLine);
        }
        
        
        
        //thread3
        private void checkClinetStatus()
        {
            catchClient = new System.Timers.Timer();
            catchClient.Elapsed += new ElapsedEventHandler(catchClient_Elapsed);
            catchClient.Interval = 100;
            catchClient.Start();
        }

        void catchClient_Elapsed(object sender, ElapsedEventArgs e)
        {
            //????
            //Trace.WriteLine(client.Connected);
        }
        
                
        private int checknum = 0;
        void SendBtClick(object sender, EventArgs e)
        {
            checknum ++ ;
            if(sendTx.Text =="")
                sendTx.Text = "mrg form C#" + checknum.ToString();
            writer.WriteLine(sendTx.Text + "\n");
            writer.Flush();
        }
        
        void DisconnectBtClick(object sender, EventArgs e)
        {
            try{
                client.Close();
            }catch( Exception ex){}
            writer.Close();
            reader.Close();
            server.Stop();
        }
    }
}
 
 
 
 
 
 AS3 code (flex4)
 
 
 
 
 
 
 
 
 
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/halo" minWidth="1024" minHeight="768"
               width="299" height="522">

    <fx:Script>
        <![CDATA[
            
            private var client:Socket;
            protected function connetBt_clickHandler(event:MouseEvent):void
            {
                
                client = new Socket;
                
                if(ipTx.text == "")
                    ipTx.text = "127.0.0.1";
                if(portTx.text == "")
                    portTx.text = "1000";
                
                client.connect(ipTx.text , int(portTx.text));
                client.addEventListener(Event.CONNECT , serverConnect);
                client.addEventListener(ProgressEvent.SOCKET_DATA , onData);
                client.addEventListener(Event.CLOSE , disconnect);
                
                // TODO Auto-generated method stub
            }
            private function serverConnect(e:Event):void
            {
                traceBox.appendText("connect server" + "\n");
            }
            private function onData(e:ProgressEvent):void
            {
                trace("data");
                traceBox.appendText("c#Mrg : " + client.readUTFBytes(client.bytesAvailable) + "\n");
            }
            private function disconnect(e:Event):void
            {
                traceBox.appendText("close server" +"\n");
                client.close();
            }

            protected function sendBt_clickHandler(event:MouseEvent):void
            {
                if(sendTx.text == "")
                    sendTx.text = "mrg from As3";
                client.writeUTFBytes(sendTx.text + "\n");
                client.flush();
            }

        ]]>
    </fx:Script>

    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:TextArea x="10" y="89" width="279" height="276" id="traceBox"/>
    <s:TextArea x="11" y="390" width="279" height="26" id="sendTx"/>
    <s:TextArea x="10" y="10" height="24" width="149" id="ipTx"/>
    <s:TextArea x="167" y="10" height="24" width="122" id="portTx"/>
    <s:Button x="10" y="42" label="connect" width="279" id="connetBt" click="connetBt_clickHandler(event)"/>
    <s:Button x="10" y="474" label="disconnect" width="279" id="disconnectBt"/>
    <s:Button x="10" y="425" label="sendMrg" width="279" id="sendBt" click="sendBt_clickHandler(event)"/>
</s:Application>
 
 
 
c#에서는 stream을 readLine 으로 받는다. 따라서 
as3 에도 string 값을 "  somstring  " + " \n" 으로 줄을 넘겨줘야 c#에서 read 할수 있다.
Yamecoder 야매코더_
tags : AS3, c#, Flex, socket
C# 2010.12.04 00:14

[CustomEvent] C# 의 사용자 이벤트 작성

사용자 이벤트라 함은 이벤트 객체의 고유 속성을 사용할수 있어야 한다.

AS3 에서 보면

addEventListener( e:CustomEvent , handler )
function handler(e:CustomEvent)
{
    e.propertys;
}

여기서 e의 속성을 사용하여야 한다는 말이 된다.



이것을 c#으로 구현 하여 보자,

우선 테스트 코딩을 보면 , 기존의 이벤트와 사용법이 같다.
( 먼저 덩어리를 보고 시작하자. )




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {


            //이벤트를 담고있는 객체를 생성��고 
            CustomEvent ev = new CustomEvent();


            //이벤트객체�� event 에 델리게이트를 추가 한다.
            // e_myEvent 는 이벤트가 ��출��었을때 실행될 메소드 이다.
            ev.myEvent += new CustomEvent.CustomEventDelegate(e_myEvent);


            //만약 이벤트를 무작정 발생시킬려면 
            //바로 메소드를 ��출��면 된다.
            //ev.ActivateEvent("ck", 123);


            //테스트로 아무런 문자�� 입력 받는다.
            string str = Console.ReadLine();
            //문자가 null 이 아니라면,
            if (str != null)
            {
                //이벤트를 발생시킨다.
                ev.ActivateEvent(str, str.Length);
            }
        }


        // 이벤트를 받는 메소드 , sender 는 발생시킨 객체
        // e는 이벤트�� 속성을 담고 있는 객체 이다.
        static void e_myEvent(object sender, CustomEventArg e)
        {

            Console.WriteLine("Event ::  " + sender + "    " + e);
            Console.WriteLine("");
            Console.WriteLine("text :: ", e.Arg1 + "    length :: " + e.Arg2);

        }
    }
}






그다음은 속성을 만드는 클래스이다.




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class CustomEventArg
    {

        //이벤트를 담을 클��스
        //별 내용 없다. 단지 저장�� 기능을 한다.
        //여기서 사용자가 필요한 속성을 추가 ��면된다.
        private string _arg1;
        private int _arg2;

        public CustomEventArg(string arg1 , int arg2)
        {
            _arg1 = arg1; 
            _arg2 = arg2;
        }

        public string Arg1
        {
            get{return _arg1;}
        }
        public int Arg2
        {
            get{return _arg2;}
        }
    }
}








마지막으로 결정적인 이벤트 클래스이다.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class CustomEvent
    {
       
        // 이벤트 를 ��리할 델리게이트와 그�� 이벤트이다.
        // 여기서 델리게이트는 기존�� 이벤트들�� 속성과 같이
        // 매개변��를 만들어준다.
        public delegate void CustomEventDelegate(Object sender, CustomEventArg e);
        public event CustomEventDelegate myEvent;

        // 이벤트를 발생시킬 메소드이다. 여기서 주요 속성을 입력 받는다.
        // 만약 다른곳�� 정보를 이용한다면 구지 안해도 된다만...
        public void ActivateEvent(string arg1 , int arg2)
        {
            // 이벤트 속성 객체를 선언��고 그�� 매개변��를 전달한다.
            CustomEventArg customArg = new CustomEventArg(arg1 , arg2);

            //그리고 이벤트델리게이트와 연결시킨다.
            myEvent(this, customArg);
        }
    }
}




그리고 ,. 다시한번 Main 을 보자.


Yamecoder 야매코더_
C# 2010.12.04 00:03
Powerd by Tistory, designed by criuce
rss