달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
요즘 활동을 열심히 하고 있는 개발자 그룹을 소개 드립니다

Windows Phone개발에 관련되어 많은 정보들이 있는 곳 입니다
카페지기님은 옴니아폰을 사용하면서 많이 들어보셨을 "옴니아노"의 개발자 입니다
(사진의 여성분이라는 건 아닙니다 -ㅅ-;)

수많은 정보들과 실력자 분들께서 많은 도움을 주시기 때문에
초보 개발자 분들도 쉽게 접근해서 배우실 수 있습니다

지금 시작하세요!


http://www.WinMoDev.net 
 
:
Posted by Lunaness

이건 좀.. 부크러운 정보이긴 합니다

제가 엄청 삽질하다가 MSDN보고 아...  한거 였으니깐요

다들 아시는 분들도 많으시겠지만..

저처럼 부끄러운일 안당하시도록 제가 총대 매고 적어 올립니다

 

스마트폰개발이 활성화 되면서 무엇보다 중요한 것은 UI입니다

(요즘은 사용자의 경험을 중요시한다고 해서 UX라고 부르기도 한답니다)

그러다보면 가장 쉽게 할 수 있는 것이 바로 이미지로 작업 하는 것 인데요

 

이렇게들 많이 사용하실 것 입니다

Bitmap imgBuf_Title = new Bitmap(480,800);

 

VWGA급 같은 경우 같은 WQVGA에 비해

같은 이미지의 영역에 표현하려면4배의 용량을 갖게 됩니다

이러다보면 무턱대고 Bitmap 객체 잔뜩 생성해서 이미지를 열심히 넣다보면

단말기의 실행메모리는 아직 여유가 있는데 프로그램이 죽어버리는 것을 보실 수 있는데요

 

이건 WinCE 단말기에서 그래픽 입출력을 담당하는 (간단하게 표현한 것 입니다) GWES.exe 프로세스가

20M정도 넘어가면 프로세스 자원 확보를 위해 자체적으로 관련 어플리케이션을 종료시키 때문 입니다

GWES.exe의 역할은 이곳에서 확인하세요 http://blog.naver.com/kri7001?Redirect=Log&logNo=30043684638

이런 상황이 오게 되는 것 이지요...

더 정확하게는 User Application에서 Data Abort에러가 발생하지만  watson에서 그 에러를 GWES에서 처리할 수 있도록 해주기 때문에 GWES.EXE에서 문제가 보이는 것처럼 되는 것 입니다

 

아무래도 장치 드라이버와 입출력 관련 디바이스를 직접적으로 제어하는 것 이다보니

많은 양의 데이터가 누적되어 있는 경우 안전을 위하여 자체적으로 어플리케이션을 종료 시킵니다

사용자가 원치 않는데 종료되는 원인 중 하나 이기도 하구요

 

재미있는것은 예전에 나온 단말기인 Axim X51v에서는 GWES.EXE의 누적이 거의 없는데

옴니아1, 옴니아2에서는 심각하게  누적되는 것이 눈에 보이네요

 

잡설이 좀 길었습니다만.. 결론은 간단합니다

 

Bitmap을 선언하실 때 다음처럼 선언해 주세요

Bitmap imgBuf_Title = new Bitmap(480,800,  PixelFormat.Format16bppRgb565 );

http://msdn.microsoft.com/ko-kr/library/system.drawing.imaging.pixelformat(VS.80).aspx

 

간단하게 32bit에서 16bit로 내려주는 것 만으로도 충분한 효과를 볼 수 있습니다

가장 좋은 것은 최대한 사용을 줄이고, 따로 관리하는 방법이겠지만..

어쩔수 없이 사용해야 한다면 저렇게 낮춰 주는게 명답이겠네요

 

그냥 책에 있는 예제만 보고 만들다보니 저런 간단한 곳에서 실수를 해버리네요..


:
Posted by Lunaness

이번에 옴니아2에서 프로그램 실행 도중 하드웨어 키 입력 시 변경되는 문제 때문에

고민고민하다가 찾아둔 내용이라 백업 겸 작성합니다

 우선 출처는 데브피아 입니다 (http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=7083&MAEULNo=911&no=41648&ref=41520)

하드웨어 키를 입력 받기 위해서 .Net CF에서는 Hardware 컨트롤이 존제합니다만...
옴니아2에서 사용자가 변경할 수 있는 키는 단 한개로
(물론 직접 레지스트리를 수정하거나 해서 하드웨어 키를 지정할 수 는 있지만요)

HardwareButton bt;
bt.HardwareKey = HardwareKeys.ApplicationKey1;

이런식으로 선언하여 KeyDown에서 감지하기에는 통화버튼, 종료버튼, 볼륨조절, 잠금버튼, 카메라 버튼 과 같은 키 입력은 감지를 하지 못합니다

또한 키 입력을 막기 위해서

AllKeys(TRUE);

라는 것을 사용하지만, 이렇게 하면 모든 하드웨어 키 이벤트가 막히는 상황인지라...
찾다보니 API를 이용한 키보드 후킹으로 조건을 분리하여 처리하는 것을 찾았습니다

 

이예찬 (blackmagic2) 

네이티브 메소드를 이용했습니다^^

Sunscape 라는 프로그램에서 발췌(?) 했는데요,,


        public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);

        [DllImport("coredll.dll")]
        public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);

        [DllImport("coredll.dll")]
        public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);

        public struct KBDLLHOOKSTRUCT
        {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public IntPtr dwExtraInfo;
        }

 

이 소스를 추가해 주시교요,,


        private readonly NativeMethods.HookProc HookProcedure;
        private readonly int hHook;

이 소스를 선언부에 선언 해 주시구,,

 

Form 클래스의 생성자 메소드에


            HookProcedure = KeyboardHookProc;
            hHook = NativeMethods.SetWindowsHookEx(20, HookProcedure, IntPtr.Zero, 0);

를 추가해 주세요

 


        private static int KeyboardHookProc(int code, IntPtr wParam, IntPtr lParam)
        {
            NativeMethods.KBDLLHOOKSTRUCT hookStruct = (NativeMethods.KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(NativeMethods.KBDLLHOOKSTRUCT));
            if (code >= 0)
            {
            }
            return 1;
        }

그다음 이 함수를 추가해 주시면 됩니다^^
if문 사이에 특정한 키가 눌리면 이벤트를 발생시키는 구문을 넣으면 될 것 같군요^^;

 

잠기기는 하다만,,, 확실히 완벽한지는 잘 모르겠군요^^

완벽한지는 모르겠다고 하셨지만..  정말 잘 됩니다
KeyboardHookProc에 모든 코드를 처리하지 않고 return 1;로 하였기 때문에 전부 키가 막히는데요
이걸 약간 고치면 하드웨어 키 마다 각각 다른 작업을 처리할 수 있게 변경이 가능합니다

/// 0x72 : call button
/// 0x73 : end button
if (hookStruct.vkCode == 0x72 || hookStruct.vkCode == 0x73)
{
     SystemSettings.ScreenOrientation = ScreenOrientation.Angle0;
}
/// 0x5b : Home Button
else if (hookStruct.vkCode == 0x5b)
{
     SystemSettings.ScreenOrientation = ScreenOrientation.Angle0;
     main_VisibleForm();
}

return 0;

저는 이런식으로 고쳤는데요, 분기점이 많은 것 도 아니라서 그냥 if문으로 분리 했습니다
hookStruct에 있는 vkCode를 참조하시면 입력받는 하드웨어 버튼의 키가 나오네요
일단 옴니아1, 옴니아2에서 정상 동작 합니다
마지막에 return 0를 해준 것은 1로 해주면 통화버튼을 눌렀을 때, 키패드창이 안나타나서 return 0로 변경한 것 입니다

:
Posted by Lunaness