1. Introduction닷넷 프레임워크 기반이 아닌 WIN DLL을 이용한 윈도우즈 시스템을 다루도록 해보겠다.
여기서 다루어 볼 내용은 시스템을 강제로 sutDown시키는 것과 Sound 재생, CD device의
열고 닫기 정도가 되겠다.
2. Function우리가 시스템을 제어에 필요한 Win API함수를 몇가지 알고 넘어 가도록하자.
1) PlaySound - WinAPI Declare
BOOL PlaySound(
LPCSTR pszSound,
HMODULE hmod,
DWORD fdwSound
);
- C# Import Declare
public int PlaySound(
string lpszName,
int hModule,
int dwFlags
);
첫번재 인자값은 플레이가 될 연주 경로이고, 두번재는 리소스 핸들, 세번째 인자값은 연주형태에 따른 인자 값이다.
2) InitiateSystemShutdown
시스템을 강제로 종료 해주는 함수이다. 자세한 설명은 생략 하도록 하겠다.
3) MCI(Media Control Interface) 관련
우리가 CD를 열고 닫을때 사용하게 될 함수 이다. CD미디어 제어 뿐 아니라 여러가지 미디어
관련 작업을 할수 있다.이 MCI관련 함수들로 사운드도 역시 제어할수 있다.
mciSendString는 모든 명령어들이 일상적인 문장 (물론 영문)으로 구성되어 있다.
이를테면 'play', 'close' 등과 같은 문자열을 사용하여 재생과 종료를 지시할 수 있다.
mciSendCommand는 재생에 필요한 정보를 파라메터로 지정하여 명령을 내리게 된다.
일상언어로 사운드 장치를 제어할 수 있다는 점에서 mciSendString에 호감이 가지만
이 함수는 mciSendCommand를 사용할 때 보다 속도는 느리다. 왜냐하면 명령의 실행에
앞서 명령어를 해석하는 인터프리터 (MCI interpreter)를 거치기 때문이다. 이 과정에서 올바른 명령어가
사용되었는지를 검사하고 그 명령어를 처리할 수 있는 저급수준의 함수를 호출해 준다.
MCIERROR mciSendString(
LPCTSTR lpszCommand, // MCI 명령 문자열 주소
LPTSTR lpszReturnString, // 함수가 리턴하는 처리결과 문자열 저장버퍼 주소
UINT cchReturn, // 리턴버퍼에 저장될 문자수 지정
HANDLE hwndCallback // 명령어 처리후 notify 메시지를 수신할 윈도우의 핸들
);
3. Code
1) Win32클래스
|
class Win32 { //시스템 종료 [DllImport("advapi32.dll")] public static extern int InitiateSystemShutdown(string lpMachineName,string lpMessage,int dwTimeout,int bForceAppsClosed,int bRebootAfterShutdown); //MCI 관련 명령어 [DllImport("winmm.dll")] public static extern int mciSendCommand(int wDeviceID,int uMessage,int dwParam1,int dwParam2); [DllImport("winmm.dll", CharSet=CharSet.Ansi)] public static extern int mciGetDeviceID([MarshalAs(UnmanagedType.LPArray)] byte[] lpBuffer); [DllImport("winmm.dll")] //Command Send public static extern int mciSendString ([MarshalAs(UnmanagedType.LPArray)] byte[] lpBuffer, [MarshalAs(UnmanagedType.LPArray)] byte[] lpBuffers,int uReturnLength,int hwndCallback); //SOUND 관련 명령어 public static extern int PlaySound(string lpszName,int hModule,int dwFlags); } |
위와같이 Static 메소드가 담긴 Win32메서드를 선언한다.
2) 함수 호출
|
//사운드 연주 private void button2_Click(object sender, System.EventArgs e) { Win32.PlaySound("mail2000.wav",0,0); } //CD 열기 private void button3_Click(object sender, System.EventArgs e) { Win32.mciSendString(System.Text.Encoding.ASCII.GetBytes("open cdaudio"),System.Text.Encoding.ASCII.GetBytes(""),0,0); int device=Win32.mciGetDeviceID(System.Text.Encoding.ASCII.GetBytes("cdaudio")); int rtn = Win32.mciSendCommand(device,0x80D,0x100,0); } //CD 닫기 private void button4_Click(object sender, System.EventArgs e) { int rtn=Win32.mciSendString(System.Text.Encoding.ASCII.GetBytes("open cdaudio"),System.Text.Encoding.ASCII.GetBytes(""),0,0); int device=Win32.mciGetDeviceID(System.Text.Encoding.ASCII.GetBytes("cdaudio")); rtn = Win32.mciSendCommand(device,0x80D,0x200,0); } //시스템 종료 private void button5_Click(object sender, System.EventArgs e) { Win32.InitiateSystemShutdown("ns.","안녕",1,1,0); MessageBox.Show("종료결과:"); } |
4.Come To The Finish
닷넷 프레임기반에 의존하여 프로그램하는 것은 어느정도 한계가 있다.
그렇기 때문에 적절한 Win Dll을 Import하여 프로그래밍하는 스킬을 쌓아 나가자.
|
|
- 웹 서비스의 세계로 - 구글 검색을 활용해보자. (0)2007/02/05
- 정렬된 Named Color List 만들기 (0)2007/02/05
- 여러가지 윈도우 시스템 제어 (2)2007/02/05
- 사용자 정의 Collection 클래스 만들기 (0)2007/02/05
- 도스명령 수행 프로그램을 만들어보자 (0)2007/01/25

수안이의 컴퓨터 연구실




Leave your greetings.
.mid 안 되는 것 같은데 mid파일을 소리나게 하는 방법이 있을까요
2009/01/21 22:59 [ Permalink : Modify/Delete : Reply ]아니면 어떤 라이브러리를 추가하면 자체내에서 음계소리를 내게 할 수도 있나요.
파일을 불러오는 것보다 그게 더 속도가 빠르겠죠?
c#으로 피아노 건반 프로그램을 만들어보려고 하거든요
기본적으로 winmm.dll 파일을 import 하시면 MIDI 파일을 재생할 수 있습니다. 저도 예전에 WINAPI로 피아노 건반 프로그램을 만들어 보려고 했었는데... C#으로 빠르고 간단하게 제작 가능합니다.
2009/01/24 15:32 [ Permalink : Modify/Delete ]MIDI 파일 구조
http://ec8.springnote.com/pages/1687174