'Languages/C#'에 해당되는 글 15건

  1. 2010.07.19 [ C# ] Default Sound Device 변경하기
  2. 2010.05.21 [ C# ] XML 쓰고 읽기
  3. 2010.05.21 [ C# ] Network 연결 확인
  4. 2009.04.11 소수점 자릿수 출력하기
  5. 2009.03.30 c#으로 툴바 만들기 2
Languages/C#2010. 7. 19. 17:51

최근에 프로그래밍을 하면서 기본 Sound Device를 상황에 맞게 선택한 Device로 설정해야 하는 상황이 발생하였습니다.

이리저리 알아보고 이것저것 시도를 해보았지만 구글신에게 버림받고 COM, Multimedia, System Programming등 에 대한

이해와 실력이 부족하기에 좌절을 맛봐야 했습니다. ㅠㅠ

이번 포스팅은 저와 같이 모자란 실력에 고민하는 분들에게 "모로 가도 서울만 가면 된다" 는 말이 있듯이

약간의 어이 없는 방법을 소개하고자 합니다. -_- ;;

 

기본적으로 다음 그림과 같이 제어판의 소리 메뉴를 선택하여 장치 목록 중에서 기본 장치로 설정하기 위해

해당 목록을 선택하여 마우스 오른쪽 버튼을 눌러 팝업창을 띄운 후 기본 장치로 설정을 클릭하게 되면

기본 사운드 장치로 설정이 되어집니다.

 

 

제가 생각해 낸 방법은

바로 이 과정을 프로그래밍으로 동작할 수 있게 구현한 것입니다. ;;

 

이를 구현하기 위해서 오랫만에 API 함수를 사용하게 되었습니다.

두 가지의 메뉴를 선택할 수 있게 하였는데요. 사용 여부 메뉴와 기본 장치로 설정입니다.

 

부끄럽지만 저 과정을 코드로 옮긴 소스는 다음과 같습니다.

public SoundDeviceChange()

{

    // 사운드 설정 창 실행 ( 바로가기 파일 실행 )

    Process.Start("Sound.lnk");

 

    // 창이 열리기 위한 잠시 대기 시간

    Thread.Sleep(500);

 

    SetHandle();

 

    // 현재 윈도우를 최상위로 설정

    BringWindowToTop(new WindowInteropHelper(Application.Current.MainWindow).Handle);

 

    int moveX = (int)SystemParameters.FullPrimaryScreenWidth;

    int moveY = (int)SystemParameters.FullPrimaryScreenHeight;

 

    // 사운드 설정창의 위치를 오른쪽 하단으로 이동

    MoveWindow(soundHandle, moveX, moveY, 0, 0, false);

}

 

// 핸들 얻어오기

private void SetHandle()

{

    // 바탕화면 핸들

    deskTopHandle = GetDesktopWindow();

 

    // 사운드 설정 창 핸들

    soundHandle = FindWindow(null, "소리");

 

    // 사운드 설정 창의 재생 탭 핸들

    playHandle = GetWindow(soundHandle, GW_CHILD);

 

    // 사운드 설정 창의 라벨 핸들 ( 설정을 수정할 재생 장치 선택: )

    lableHandle = GetWindow(playHandle, GW_CHILD);

 

    // 사운드 설정 창의 목록(ListView) 핸들

    listViewHandle = GetWindow(lableHandle, GW_HWNDNEXT);

 

    // 사운드 설정 창이 늦게 뜰 경우를 대비

    if (listViewHandle == IntPtr.Zero)

    {

        SetHandle();

    }

}

 

// 해당 목록에서 마우스 오른 쪽 버튼 클릭 동작하는 함수

private void ShowPopupWindow(int soundDeviceIndex)

{

    // 선택 목록 인덱스가 이전 인덱스보다 위라면

    if (previousSoundDeviceIndex > soundDeviceIndex)

    {

        // 해당 인덱스 만큼 위로 이동

        for (int j = 0; j <= previousSoundDeviceIndex; j++)

        {

            PostMessage(listViewHandle, WM_KEYDOWN, VK_UP, 0);

        }

    }

    // 선택 목록 인덱스가 이전 인덱스보다 아래라면

    else

    {

        // 해당 인덱스 만큼 아래로 이동

        for (int j = 0; j <= soundDeviceIndex; j++)

        {

            PostMessage(listViewHandle, WM_KEYDOWN, VK_DOWN, 0);

        }

    }

 

    // 현재 지점에서 마우스 오른쪽 이벤트 발생

    PostMessage(listViewHandle, WM_RBUTTONUP, 0, 0);

 

    // 목록에 대한 설정 팝업 창 핸들 찾기

    while (true)

    {

        // 바탕화면 핸들의 첫번 째 자식( 팝업창은 첫 번째 자식 윈도우로 등록 됨 )

        popupHandle = GetWindow(deskTopHandle, GW_CHILD);

 

        // 윈도우의 클래스 이름 얻어오기

        GetClassName(popupHandle, className, 256);

 

        // 팝업창의 클래스 이름은 #32768

        if (className.ToString() == "#32768")

        {

            // 팝업창의 스타일을 WS_DISABLED로 설정하여 사라지게 만듬.

            SetWindowLong(popupHandle, GWL_STYLE, WS_DISABLED);

            break;

        }

    }

}

 

// 현재 인덱스의 디바이스를 기본 장치로 설정

public void ChangeDevice(int soundDeviceIndex)

{

    // 이전 디바이스 인덱스와 같으면 리턴

    if (previousSoundDeviceIndex == soundDeviceIndex)

    {

        return;

    }

 

    // 현재 목록에 대한 설정 팝업 창 실행

    ShowPopupWindow(soundDeviceIndex);

 

    // 기본 장치로 설정 메뉴 단축키는 D

    PostMessage(popupHandle, WM_KEYDOWN, VK_D, 0);

 

    // 이전 디바이스 인덱스 갱신

    previousSoundDeviceIndex = soundDeviceIndex;

}

 

// 현재 인덱스의 디바이스의 사용 여부를 변경

public void ChangeDevice(int soundDeviceIndex, bool disable)

{

    // 현재 목록에 대한 설정 팝업 창 실행

    ShowPopupWindow(soundDeviceIndex);

 

    // 사용은 2 칸 아래

    int keyDown = 2;

 

    // 사용 안함은 3칸 아래

    if (disable)

    {

        keyDown = 3;

    }

 

    // 해당 메뉴 만큼 아래로 이동

    for (int k = 0; k < keyDown; k++)

    {

        PostMessage(popupHandle, WM_KEYDOWN, VK_DOWN, 0);

    }

 

    // Enter 이벤트 발생

    PostMessage(popupHandle, WM_KEYDOWN, VK_RETURN, 0);

 

    // 이전 디바이스 인덱스 갱신

    previousSoundDeviceIndex = soundDeviceIndex;

}

 

실행화면과 같이 목록의 디바이스 중에서 선택한 선택한 디바이스를 선택하고

SoundChange 버튼을 누르게 되면 기본장치로 설정이 되어집니다.

Sound On 버튼을 누르면 사용 상태로 변경하게 되고 Sound Off 버튼을 누르면 사용 안함 상태로 변경되어 집니다.

 

제대로 된 방법이 아니기 때문에 몇 가지 제약사항이 있습니다.

 

1. 윈도우 7을 바탕으로 만들었기 때문에 다른 버전에서도 위와 같은 절차인지 모르겠습니다.

 

2. 팝업창을 DISABLE 시키긴 하지만 잠깐의 깜빡일 정도로 보일 수가 있습니다.

    컴퓨터 사양에 틀린 것 같습니다. 보이는 컴퓨터와 안 보이는 컴퓨터가 있더군요.

 

3. 스피커와 오디오의 팝업창 메뉴가 다르기 때문에 오디오를 선택 후 사용과 사용안함의 기능을

    사용하면 제대로 동작하지 않습니다. 오디오 목록들은 사운드 설정 창에서 사용안함으로 변경 후

    마우스 오른쪽 버튼을 눌러 사용 할 수 없는 장치 표시메뉴를 UnCheck 하시는게 좋습니다.

 

전체 코드는 첨부파일을 받으시면 됩니다.

 

혹시 진짜로 코드로 디바이스를 제어하는 법을 아시는 분께선 꼭 알려주시길 바랍니다. ㅠㅠ

'Languages > C#' 카테고리의 다른 글

[ C# ] Win32 API MouseEvent  (8) 2010.12.07
[ C# ] C# FTP Download  (3) 2010.07.21
[ C# ] XML 쓰고 읽기  (0) 2010.05.21
[ C# ] Network 연결 확인  (0) 2010.05.21
소수점 자릿수 출력하기  (0) 2009.04.11
Posted by 열ㅇl
Languages/C#2010. 5. 21. 13:27

XML 파일을 문자열로 생성하고 읽어 들이는 방법입니다.

 

        /// <summary>

        /// XML 생성

        /// </summary>

        private void CreateXML()

        {

            // 생성할 XML 파일 경로와 이름, 인코딩 방식을 설정합니다.

            XmlTextWriter textWriter = new XmlTextWriter(@"C:\example.xml", Encoding.UTF8);

 

            // 들여쓰기 설정

            textWriter.Formatting = Formatting.Indented;

 

            // 문서에 쓰기를 시작합니다.

            textWriter.WriteStartDocument();

 

            // 루트 설정

            textWriter.WriteStartElement("root");

 

            // 노드와 값 설정

            textWriter.WriteStartElement("root_a");

            textWriter.WriteString("a");

            textWriter.WriteEndElement();

 

            // 노드 안에 하위 노드 설정

            textWriter.WriteStartElement("root_b");

 

            textWriter.WriteStartElement("b");

            textWriter.WriteString("b");

            textWriter.WriteEndElement();

 

            textWriter.WriteStartElement("bb");

            textWriter.WriteString("bb");

            textWriter.WriteEndElement();

 

            textWriter.WriteEndElement();

 

            textWriter.WriteStartElement("root_c");

            textWriter.WriteString("1");

            textWriter.WriteEndElement();

 

            textWriter.WriteEndElement();

 

            textWriter.WriteEndDocument();

            textWriter.Close();

        }

 

        /// <summary>

        /// XML 파일 읽기

        /// </summary>

        private void ReadXML()

        {

            try

            {

                XmlDocument xmldoc = new XmlDocument();

                xmldoc.Load(@"C:\example.xml");

                XmlElement root = xmldoc.DocumentElement;

 

                // 노드 요소들

                XmlNodeList nodes = root.ChildNodes;

 

                // 노드 요소의 값을 읽어 옵니다.

                foreach (XmlNode node in nodes)

                {

                    switch (node.Name)

                    {

                        case "root_a":

                            string a = node.InnerText;

                            break;

 

                        case "root_b":

                            string b = node["b"].InnerText;

                            string bb = node["bb"].InnerText;

                            break;

 

                        case "root_c":

                            int c = int.Parse(node.InnerText);

                            break;

                    }

                }

            }

            catch (IOException ex)

            {

                Console.WriteLine(ex.ToString());

            }

        }

'Languages > C#' 카테고리의 다른 글

[ C# ] C# FTP Download  (3) 2010.07.21
[ C# ] Default Sound Device 변경하기  (0) 2010.07.19
[ C# ] Network 연결 확인  (0) 2010.05.21
소수점 자릿수 출력하기  (0) 2009.04.11
c#으로 툴바 만들기  (2) 2009.03.30
Posted by 열ㅇl
Languages/C#2010. 5. 21. 12:00

현재 네트워크가 연결 되었는지를 확인하는 메소드입니다.

 

  using System.Net.NetworkInformation;

 

  // 네트워크 연결

  if (NetworkInterface.GetIsNetworkAvailable())

  {

      // to do

  }

  else

  {

      // to do

  }

'Languages > C#' 카테고리의 다른 글

[ C# ] C# FTP Download  (3) 2010.07.21
[ C# ] Default Sound Device 변경하기  (0) 2010.07.19
[ C# ] XML 쓰고 읽기  (0) 2010.05.21
소수점 자릿수 출력하기  (0) 2009.04.11
c#으로 툴바 만들기  (2) 2009.03.30
Posted by 열ㅇl
Languages/C#2009. 4. 11. 21:00

String..::.Format 메서드 (String, Object)

- 지정된 string 의 형식 항목을 지정된 object 인스턴스의 값에 해당하는 텍스트로 바꿉니다.

 

< 매개 변수 >

format
형식: system..::.string
합성 형식 문자열 입니다.

arg0

형식: syste..::.object
형식을 지정할 object 입니다.

< 반환 값 >

 

형식: system..::.string
첫째 형식 항목이 arg0에 해당하는 string으로 바뀐 format의 복사본을 반환합니다.

 

ex) string.Format("{0,0:F6}", string 변수[0]);

 

MSDN: http://msdn.microsoft.com/ko-kr/library/fht0f5be.aspx

'Languages > C#' 카테고리의 다른 글

[ C# ] C# FTP Download  (3) 2010.07.21
[ C# ] Default Sound Device 변경하기  (0) 2010.07.19
[ C# ] XML 쓰고 읽기  (0) 2010.05.21
[ C# ] Network 연결 확인  (0) 2010.05.21
c#으로 툴바 만들기  (2) 2009.03.30
Posted by 열ㅇl
Languages/C#2009. 3. 30. 17:08

원본 출처: http://ljh131.tistory.com/68

 

사실 익스플로러 툴바, BHO(Browser Helper Object)를 만드는게 여간 힘든일이 아닙니다. COM을 써야할 뿐더러 일반적인 프로그램이 아니기 때문에 정보 조차 잘 없죠.

하지만 C#으로 만들면 정말 쉽습니다.

우선 전 코드 프로젝트를 참고했습니다.

Band Objects - .NET 2.0 Redux
http://www.codeproject.com/csharp/BandObjects20.asp?select=1819328&df=100&forumid=306921&exp=0
 

위의 소스 파일은 코드 프로젝트의 소스를 사용하기 쉽게 약간 수정한 파일입니다. 기본 구조는 코드 프로젝트 소스와 마찬가지로 BandObject클래스를 상속받는 것입니다.

우선 다음 두 개의 레퍼런스를 추가하도록 합니다. COM의 MSHTML(Microsoft HTML Object Library)과 SHDocVw(Microsoft Internet Controls) 입니다. 두 레퍼런스를 추가하면 Object Browser에서 이들 어셈블리를 볼 수 있습니다.

다음 단계는 BandObject클래스를 상속받아 실제 툴바를 구현하는 단계입니다. 아래 코드는 사용자 참여 웹 툴바에서 사용된 예이며, 툴바와 BHO 구현에 필요한 핵심적인 코드만 적어 놓았습니다. Guid는 자신의 Guid를 적으세요.

 

     1 [Guid("719FAB8A-8E67-4ba6-915D-4EE1AD3A2CEE")]  

    2 [BandObject("사용자 참여 웹 툴바", BandObjectStyle.Horizontal |

    3     BandObjectStyle.ExplorerToolbar, HelpText = "사용자 참여 웹 툴바")]  

    4 public class UpwBandObject : BandObject  

    5 {  

    6     public UpwBandObject()  

    7     {  

    8         InitializeComponent();  

    9 

   10         minSize = new Size(100, 27); // 최소 크기를 반드시 적어줘야 합니다.  

   11 

   12         SetSiteEvent += new SetSiteEventHandler(UpwBandObject_SetSiteEvent);  

   13         ShowDWEvent += new ShowDWEventHandler(UpwBandObject_ShowDWEvent);  

   14     }  

   15     private void UpwBandObject_ShowDWEvent(bool fShow)  

   16     {  

   17         toolbarVisible = fShow;  

   18 

   19         RefreshCurrentSite();  

   20     }  

   21 

   22     private void UpwBandObject_SetSiteEvent(object pUnkSite)  

   23     {  

   24         if (pUnkSite != null)  

   25         {  

   26             // add events  

   27             webBrowserClass.BeforeNavigate2 +=

   28                 new DWebBrowserEvents2_BeforeNavigate2EventHandler(webBrowser_BeforeNavigate2);  

   29             webBrowserClass.NavigateComplete2 +=

   30                 new DWebBrowserEvents2_NavigateComplete2EventHandler(webBrowser_NavigateComplete2);  

   31             webBrowserClass.DocumentComplete +=

   32                 new DWebBrowserEvents2_DocumentCompleteEventHandler(webBrowser_DocumentComplete);  

   33         }  

   34         else 

   35         {  

   36             // remove events  

   37             webBrowserClass.BeforeNavigate2 -=

   38                 new DWebBrowserEvents2_BeforeNavigate2EventHandler(webBrowser_BeforeNavigate2);  

   39             webBrowserClass.NavigateComplete2 -=

   40                 new DWebBrowserEvents2_NavigateComplete2EventHandler(webBrowser_NavigateComplete2);  

   41             webBrowserClass.DocumentComplete -=

   42                 new DWebBrowserEvents2_DocumentCompleteEventHandler(webBrowser_DocumentComplete);  

   43         }  

   44     }  

   45 

   46     private void webBrowser_BeforeNavigate2

   47         (object pDisp, ref object URL, ref object Flags, ref object TargetFrameName,  

   48               ref object PostData, ref object Headers, ref bool Cancel)  

   49     {  

   50     }  

   51 

   52     private void webBrowser_NavigateComplete2(object pDisp, ref object URL)  

   53     {  

   54     }  

   55 

   56     private void webBrowser_DocumentComplete(object pDisp, ref object URL)  

   57     {  

   58     }  

   59 

   60     private void Navigate(string url)  

   61     {  

   62         object flags = null;  

   63         object targetFrameName = null;  

   64         object postData = null;  

   65         object headers = null;  

   66 

   67         webBrowserClass.Navigate(url, ref flags, ref targetFrameName, ref postData, ref headers);  

   68     }  

   69 } 

 
컴파일 전에 System.Windows.Forms, System.Drawing 레퍼런스를 추가하고 다음 using을 코드에 넣습니다.
 

   using System.Windows.Forms; 

   using System.Runtime.InteropServices; 

   using SHDocVw; 

   using System.Reflection; 

   using System.Drawing; 

   using System.ComponentModel; 

   using Microsoft.Win32;

 
웹 브라우저 클래스의 이벤트들이 바로 BHO부분입니다. 이벤트에 관련된 부분은 Visual Studio의 Object Browser를 보면서 추가할 수 있습니다. 물론 MSDN에도 짧게나마 설명이 있습니다.

UserControl을 상속받으면 Visual Studio에서는 Designer로 폼을 편집할 수 있습니다. View Designer를 클릭해서 나오는 화면이 툴바에 나오게 될 화면입니다. 그 부분은 개발하고자 하는 툴바에 맞춰서 디자인 하시면 됩니다.

마지막 단계는 실제 툴바를 익스플로러에 등록하는 과정입니다. 우선 프로젝트 속성의 Assembly Information에서 Make assembly COM-Visible을 체크하고 컴파일을 합니다. 또 Strong name을 위해 Signing assembly (.snk)가 필요한데 이것 역시 프로젝트 속성에서 만들 수 있습니다.

그리고 빌드 후에 다음 명령을 실행 시킵니다. (Post build event에 등록 해놓으면 되겠죠.)

cd $(TargetDir)

"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil" /if Interop.SHDocVw.dll
"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil" /if $(TargetFileName)
"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm" /unregister $(TargetFileName)
"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm" /codebase $(TargetFileName)

익스플로러를 열면 툴바 영역에서 등록된 툴바가 메뉴에 표시됩니다.

디버깅은 프로퍼티의 Start Action에 externel program으로 익스플로러를 지정하면 됩니다.

'Languages > C#' 카테고리의 다른 글

[ C# ] C# FTP Download  (3) 2010.07.21
[ C# ] Default Sound Device 변경하기  (0) 2010.07.19
[ C# ] XML 쓰고 읽기  (0) 2010.05.21
[ C# ] Network 연결 확인  (0) 2010.05.21
소수점 자릿수 출력하기  (0) 2009.04.11
Posted by 열ㅇl