시스템 스피커로 비프음 내기 (C++ / C#) 모든 윈도우 32/64비트 버전

윈도우 7 64Bit 이상부터는, 더 이상 시스템의 내장 스피커를 이용하여 비프음을 낼 수 없다고 한다. (윈도우 API에서 더 이상 지원하지 않음)

그러나 아래 링크와 같이 시스템에 직접 접근해서 가능하다.

링크 : https://www.codeproject.com/Tips/1022207/Make-Buzzer-Internal-Speaker-Sound-in-Windows-bit

링크 캡쳐 (원문의 링크가 없어져 더이상 보기 어려울 경우를 대비)

사용자 삽입 이미지

C#에서 외부프로그램 실행 및 종료

C#으로 짠 또다른 프로그램(other.exe)을 실행하기위해서

 

System.Diagnostics.Process proc = System.Diagnostics.Process.Start(“./other.exe”);

 

 

 

종료

 

public const int WM_SYSCOMMAND = 0x0112;

public const int SC_CLOSE = 0xF060;

 

[DllImport(“user32.dll”)]

public static extern int FindWindow(

    string lpClassName, // class name

    string lpWindowName // window name

);

 

[DllImport(“user32.dll”)]

public static extern int SendMessage(

    int hWnd, // handle to destination window

    uint Msg, // message

    int wParam, // first message parameter

    int lParam // second message parameter

);

 

 

1. FindWindows로 창핸들을 찾아온다

 

int iHandle=Win32.FindWindow(className ,txtWndNm.Text);

2. SendMessage로 클로즈메세지를 보낸다.

 

int j=Win32.SendMessage(iHandle, Win32.WM_SYSCOMMAND,Win32.SC_CLOSE, 0);

 

Process.Kill()을 했는데도 안죽은게 이상하긴 하지만 위와 같이 사용하시면 확실히 죽을겁니다.

또한 외부 프로그램에 Message를 던질수도 있습니다.

[C#] 관리자 권한으로 실행하기

관리자 권한이 없는 상태에서 시스템의 정보를 읽거나 쓰려고 할때 프로그램이 올바르게 작동하지 않습니다. 이럴때 프로그램이 실행되면서, 관리자 권한으로 상승시키는 것이 필요한데요. C#에서 이러한 내용에 대한 코드를 정리합니다. 모든 코드는 Program.cs에서 이루어집니다. 먼저 using 절에 다음과 같은 네임스페이스를 추가합니다.

using System.Security.Principal;
using System.Diagnostics; 

그리고 현재 관리자 권한 상태인지의 여부를 파악하는 함수를 추가합니다.

public static bool IsAdministrator()
{
    WindowsIdentity identity = WindowsIdentity.GetCurrent();
 
    if (null != identity)
    {
        WindowsPrincipal principal = new WindowsPrincipal(identity);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
 
    return false;

Program.cs 파일의 Main 함수의 시작 부분에 다음의 코드를 추가하여 관리자 권한으로 실행되는지를 확인 한다.

            if (IsAdministrator() == false)
            {
                try
                {
                    ProcessStartInfo procInfo = new ProcessStartInfo();
                    procInfo.UseShellExecute = true;
                    procInfo.FileName = “IPSwitcher”;
                    procInfo.WorkingDirectory = Environment.CurrentDirectory;
                    procInfo.Verb = “runas”;
                    Process.Start(procInfo);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(“This Program need to Administrator Authority:” + ex.Message);
                }

                return;
            }

 

C# – “내 문서” 경로 찾기

C#에서 “내 문서”의 경로는

Environment.SpecialFolder 열거형을 사용하여
Environment.GetFolderPath() 메소드로 구하면 됩니다.

Console.WriteLine("GetFolderPath:{0}",Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));

자세한 사항은 아래의 MSDN을 참고하시기 바랍니다.

참고로 Windows에서의 환경변수는 아래와 같은 문자열을 사용합니다.

  • %HomeDrive% – 로그인한 계정의 정보가 들어있는 드라이브
  • %HomePath% – 로그인한 계정의 폴더
  • %SystemDrive% – 윈도우가 부팅된 드라이브
  • %SystemRoot% – 부팅된 운영체제가 들어있는 폴더
  • %ProgramFiles% – 기본 프로그램 설치 폴더
  • %TEMP%, %TMP% – 임시 파일이 저장되는 폴더
  • %ComSpec% – 기본 명령 프롬프트 프로그램
  • %USERDOMAIN% – 로그인한 시스템의 도메인 명
  • %USERNAME% – 로그인한 계정 이름
  • %USERPROFILE% – 로그인한 유저의 프로필이 들어있는 폴더명
  • %ALLUSERPROFILE% – 모든 사용자 프로필이 저장된 폴더
  • %APPDATA% – 설치된 프로그램의 필요 데이터가 저장된 폴더
  • %LOGONSERVER% – 로그인한 계정이 접속한 서버명
  • %Path% – 실행 참조용 폴더 지정 목록
  • %PathEXT% – 참조용 폴더에서 검색한 파일들의 확장자 목록

참고 : 네이버지식

C#에서 한글,영문 섞여 있을때 문자의 수 or Byte수 구하기




– 코드:

    class Class1
    {
        /// <summary>
        /// 해당 응용 프로그램의 주 진입점입니다.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            //
            // TODO: 여기에 응용 프로그램을 시작하는 코드를 추가합니다.
            //
            string tmp = “한글English”;

            byte []bArray_ =Encoding.Default.GetBytes(tmp);
            Console.Out.WriteLine(Encoding.Default.EncodingName);
            Console.Out.WriteLine(Encoding.Default.GetString(bArray_));
            Console.Out.WriteLine(bArray_.Length);

            byte []u7Array_ = Encoding.Convert(Encoding.Default, Encoding.UTF7, bArray_);
            Console.Out.WriteLine(Encoding.UTF7.EncodingName);
            Console.Out.WriteLine(Encoding.UTF7.GetString(u7Array_));
            Console.Out.WriteLine(u7Array_.Length);

            byte []u8Array_ = Encoding.Convert(Encoding.Default, Encoding.UTF8, bArray_);
            Console.Out.WriteLine(Encoding.UTF8.EncodingName);
            Console.Out.WriteLine(Encoding.UTF8.GetString(u8Array_));
            Console.Out.WriteLine(u8Array_.Length);

            byte []uArray_ = Encoding.Convert(Encoding.Default, Encoding.Unicode, bArray_);
            Console.Out.WriteLine(Encoding.Unicode.EncodingName);
            Console.Out.WriteLine(Encoding.Unicode.GetString(uArray_));
            Console.Out.WriteLine(uArray_.Length);

            byte []aArray_ = Encoding.Convert(Encoding.Default, Encoding.ASCII, bArray_);
            Console.Out.WriteLine(Encoding.ASCII.EncodingName);
            Console.Out.WriteLine(Encoding.ASCII.GetString(aArray_));
            Console.Out.WriteLine(aArray_.Length);
        }
    }

———————————————————————————–

– 결과:
한국어
한글English
11
유니코드(UTF-7)
한글English
15
유니코드(UTF-8)
한글English
13
유니코드
한글English
18
US-ASCII
??English
9

[C#]WebClient클래스로 FTP기반 파일전송 방법

Written by Youngil Kim, C#.NET Developer


 


.NET Framework 2.0의 WebClient클래스는 FTP프로토콜도 대응하기에 GOM은 FTP를 기반으로 하는 파일 업/다운로드를 구현해보았습니다.


 


– FTP기반 다운로드 방법


일단 FTP의 파일 다운로드는 DownloadFile 메소드를 이용하여 첫번째 파라미터는 다운로드할 파일의 URL(형식: ftp://FTP서버명/파일경로)을 지정합니다.


에로 ftp://ftp.microsoft.com/developr/readme.txt를 직접 웹브라이저에서 입력해보세요 실제로 접속됩니다. 이는 ftp.microsoft.com이란 FTP서버에 developer란 폴더에 있는 readme.txt파일을 지정한다는 의미입니다.


참고로 FTP서버에 접근하려면 일반적으로 사용자ID와 비밀번호를 통해 인증을 받아야 하는 경우가 있습니다. 이런 경우 WebClient클래스의 Credentials속성을 선언해둘 필요가 있습니다.


 


[WCFtpDownload.cs]


using System;
using System.Collections.Generic;
using System.Net;


namespace WCFtpDownload
{
    class Program
    {
        static void Main(string[] args)
        {
           WebClient wc = new WebClient();
           wc.Credentials = new NetworkCredential(“admin”, “passwd”);
           wc.DownloadFile(“
ftp://server/temp/a.zip”,”temp.zip“);
        }
    }
}


위 예제는 사용자명 admin, 비밀번호 passwd라는 계정으로 FTP서버 server에 로그인하고 temp폴더에 있는 a.zip파일을 다운로드하여 temp.zip이란 파일명으로 변경하여 현대 폴더에 저장하는 형태입니다.


 


– FTP기반 업로드 방법


업로드방법도 다운로드 방법만큼 간단합니다. UploadFile 메소드를 사용하면 끝나기 때문이죠 =_=;


 


[WCFtpUpload.cs]


using System;
using System.Collections.Generic;
using System.Net;


namespace WCFtpUpload
{
    class Program
    {
        static void Main(string[] args)
        {
            WebClient wc = new WebClient();
            wc.Credentials = new NetworkCredential(“admin”,”passwd”);
            wc.UploadFile(“
ftp://server/temp/xxx.zip“, “temp.zip”);


        }
    }
}


 


이 예제는 급조해서 만든거라서 연속 실행하면 두번째이후는 계속 예외가 발생합니다. 이미 파일이 있기 때문이죠 그렇기 때문에 실무에 적용시, 기존 파일이 있는 경우 파일명을 변경하여 업로드를 하는 로직이 필요하겠죠?


또한, Credentials 속성을 설정하지 않고 FTP서버에 접근하는 경우 기본값으로 사용자ID는 anonymous, 비밀번호는 anonymous@가 사용됩니다.


 


이상 끝!

C# 에서 Binary To Hex, Hex To Binary 관련된 로직(속도가 빠르다네요)

아래 방법말고도 string.Format 이나 BitConvert.tostring() 을 활용해도 되지만
작성자의 말로는 속도가 빠르다고 하는군요.. 음.. 데이터는 맞으니, 믿어보죠.
참고로 3M 이상의 데이터는 변환안됩니다. 아마도 StringBuilder 의 한계인듯..
다른 방법을 써야겠죠.. 그부분은 알아서.. 그럴 일도 없겠지만.. ㅎㅎ



public static string ByteArrayToHexString(byte[] Bytes)



    StringBuilder Result = new StringBuilder(); 
    string HexAlphabet = “0123456789ABCDEF”; 
  
    foreach (byte B in Bytes) 
        { 
        Result.Append(HexAlphabet[(int)(B >> 4)]); 
        Result.Append(HexAlphabet[(int)(B & 0xF)]); 
        } 
  
    return Result.ToString(); 

  
public static byte[] HexStringToByteArray(string Hex) 

    byte[] Bytes = new byte[Hex.Length / 2]; 
    int[] HexValue = new int[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 
                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0B, 0x0C, 0x0D, 
                                 0x0E, 0x0F }; 
  
    for (int x = 0, i = 0; i < Hex.Length; i += 2, x += 1) 
        { 
        Bytes[x] = (byte)(HexValue[Char.ToUpper(Hex[i + 0]) – ‘0’] << 4 | 
                          HexValue[Char.ToUpper(Hex[i + 1]) – ‘0’]); 
    } 
  
    return Bytes; 
}

C# 의 자료구조 Queue !!

C#… 즉.. 닷넷… 이놈 참 대단한놈이다.. 왠만한 자료구조형이 다있다.. 큐!~ 도 있다 –^ 예전에 이걸 구현해서.. 사용했던 내가.. ㄷㄷㄷ….

CShop자료구조02_자료구조_큐.cs


/*
 C#자료구조02 : 자료구조_큐(Queue).
 .NET Class의 Stack 클래스 사용.
 2005년 12월 07일
 Choi Young Gyu

*/

using System;
using System.Collections;

public class 큐
{

 public static void Main()
 {

  //[1]큐 인스턴스 생성
  Queue queue = new Queue();
  //[2]큐에 데이터 입력
  Console.WriteLine(“Enqueue : VC++”);
  queue.Enqueue(“VC++”);
  Console.WriteLine(“Enqueue : VB.NET”);
  queue.Enqueue(“VB.NET”);
  //[3]큐에서 대이터 꺼내기
  Console.WriteLine(“Dequeue : {0}”,queue.Dequeue());
  Console.WriteLine(“Dequeue : {0}”,queue.Dequeue());
 }
}



결과

사용자 삽입 이미지

DateTime 클래스 활용 C샵 – 문법

// 프로그램 시작시간
DateTime startTime = DateTime.Now;

// 1. 현재시간
DateTime now;
now = DateTime.Now;

Console.WriteLine(now); // 현재시간 전체
Console.WriteLine(now.Year); // 현재 년도
Console.WriteLine(now.Month); // 현재 달
Console.WriteLine(now.Day); // 현재 일
Console.WriteLine(now.DayOfWeek); // 현재 주
Console.WriteLine(now.DayOfYear); // 1년중 몇일째인지
Console.WriteLine(now.TimeOfDay); // 금일 자정부터 몇시간
Console.WriteLine(now.Hour); // 시간
Console.WriteLine(now.Minute); // 분
Console.WriteLine(now.Second); // 초
Console.WriteLine(now.Millisecond); // 1000분의 1초

Console.WriteLine(now.Ticks); // 1000분의 1초

// 2. 임의시간 설정
DateTime birthday;
birthday = DateTime.Parse(“2009년8월9일”); // 시분초 미지정시 자정으로
birthday = DateTime.Parse(“2009/08/09”);

Console.WriteLine(birthday);

DateTime xmas;
xmas = new DateTime(2008, 12, 25, 0, 0, 0);

Console.WriteLine(xmas);

// 3. 연산

// 3.1 오늘 + 100일
now = DateTime.Now;
DateTime result = now.AddDays(100); // 각 단위별 add메소드가 존재 MSDN참고

Console.WriteLine(result);

// 3.2 크리스마스까지 남은 날
TimeSpan result2 = xmas – now;
Console.WriteLine(result2);
Console.WriteLine(result2.Days); // NNN일 (내림표현)
Console.WriteLine(result2.TotalDays); // NNN.NNNNNNN일 (더정확)

// 3.3 오늘 – 100일
Console.WriteLine(now – TimeSpan.FromDays(100));
Console.WriteLine(now.AddDays(-100));

// 4. 날짜시간 출력형식 지정
Console.WriteLine(now.ToLocalTime()); // 2008-08-08 오전 10:31:25

Console.WriteLine(now.ToLongDateString()); // 2008년 8월 8일 금요일
Console.WriteLine(now.ToShortDateString()); // 2008-08-08

Console.WriteLine(now.ToLongTimeString()); // 오전 10:31:25
Console.WriteLine(now.ToShortTimeString());   // 오전 10:31

// 프로그램 종료시간
DateTime endTime = DateTime.Now;

Console.WriteLine(“프로그램 수행시간 : {0}/ms”, (double)(endTime – startTime).Ticks / 1000000.0F);

C#으로 동영상 플레이 제작을 위한 필수 항목


DirectX Software Develpment Kit


http://www.microsoft.com/downloads/details.aspx?FamilyID=86cf7fa2-e953-475c-abde-f016e4f7b61a&displaylang=en&Hash=qeJBP6Uksx0zY%2btLhcKYj%2fx4PDbDDOI%2btC%2bsa73SX4pkMysJCEnMU48j49VRn6%2fbDsK5k8OfHBLz%2fe9FNHN8hg%3d%3d


위 SDK를 설치한 후에


using Microsoft.DirectX.AudioVideoPlayback;


를 이용하여~ 딱 3줄로.. 동영상 재생가능~~


1. 무작정 Visual Studio 2008을 띄우고 C# WinForm 프로젝트 생성
2. [Add Reference]에서 Microsoft.DirectX.AudioVideoPlayback를 추가해주고(DirectX는 깔려 있어야 함)
3. Form을 더블 클릭하고 다음과 같이 쳐준다.



using Microsoft.DirectX.AudioVideoPlayback;


private void Form1_Load(object sender, EventArgs e){
Video v = Video.FromFile(@c:\test.avi)
;
v.Owner = this
;
v.Play()
;
}

4. F5를 누른다.


근데 안된다.


[Debug]-[Exceptions]-[LoaderLock]의 Thrown 항목을 꺼준다.


사용자 삽입 이미지
5. F5를 누른다.

사용자 삽입 이미지
ㅋㅋㅋ 성공 ….


[잡설]
이번 일주일간 WDM 디바이스 드라이버 프로그래밍 교육중이다.
Kernel Mode 프로그램에서는 좀만 잘못하면 블루 스크린…
오랜만에 보는 VisualStudio… 안보던 사이 많이 바뀌었었네…