• 로그인 함 해보끄나?

  • Sarangnamu.net June 17, 2003
    Home Login Profile Study Open Project Q&A Google Code
    wifi interface sample code
    Last Modify : 04 January, 2011(02:52)
    // wifiAvailable.cpp : 응용 프로그램에 대한 진입점을 정의합니다.
    //
    
    #include "stdafx.h"
    #include "wifiAvailable.h"
    #include <windows.h>
    #include <commctrl.h>
    
    #define MAX_LOADSTRING 100
    
    // 전역 변수:
    HINSTANCE			g_hInst;			// 현재 인스턴스입니다.
    HWND				g_hWndMenuBar;		// 메뉴 모음 핸들입니다.
    
    
    
    
    // 이 코드 모듈에 들어 있는 함수의 정방향 선언입니다.
    ATOM			MyRegisterClass(HINSTANCE, LPTSTR);
    BOOL			InitInstance(HINSTANCE, int);
    LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
    INT_PTR CALLBACK	About(HWND, UINT, WPARAM, LPARAM);
    
    
    #include <regext.h>
    #include "snapi.h"
    #pragma comment(lib, "aygshell.lib")
    
    
    #define WM_OFFSET                 10000
    #define WM_CHANGE_WIFI_AVAILABLE  (WM_OFFSET + 1)
    #define WM_CHANGE_WIFI_PRESENT    (WM_OFFSET + 2)
    #define WM_CHANGE_WIFI_POWERON    (WM_OFFSET + 3)
    #define WM_CHANGE_WIFI_CONNECTING (WM_OFFSET + 4)
    #define WM_CHANGE_WIFI_CONNECTED  (WM_OFFSET + 5)
    
    #define NOTIFY_CNT 5
    HREGNOTIFY  g_hNotify[NOTIFY_CNT];  // Handles to notifications
    
    HWND g_hCurWndDialog;   // Primary Window Dialog
    
    
    HRESULT UnregisterWindows()
    {
    	printf("Unregister windows\n");
    	long lNotifyIndx;
    
    	// For each notification handle:
    	for (lNotifyIndx=0; lNotifyIndx < NOTIFY_CNT; lNotifyIndx++)
    	{
    		if (g_hNotify[lNotifyIndx] != NULL)
    		{
    			// Close off the notification.
    			RegistryCloseNotification(g_hNotify[lNotifyIndx]);
    		}
    
    		g_hNotify[lNotifyIndx] = 0;
    	}
    
    	return S_OK;
    }
    
    HRESULT RegisterWindows()
    {
    	UnregisterWindows();
    	printf("register windows\n");
    
    	HRESULT hr;
    	NOTIFICATIONCONDITION nc;
    
    	//////////////////////////////////////////////////////////////////////////
    
    
    	nc.ctComparisonType = REG_CT_ANYCHANGE;
    	nc.dwMask           = SN_WIFISTATENETWORKSAVAILABLE_BITMASK;
    	nc.TargetValue.dw   = 0;
    
    	hr = RegistryNotifyWindow(
    		SN_WIFISTATENETWORKSAVAILABLE_ROOT,
    		SN_WIFISTATENETWORKSAVAILABLE_PATH,
    		SN_WIFISTATENETWORKSAVAILABLE_VALUE,
    		g_hCurWndDialog, 
    		WM_CHANGE_WIFI_AVAILABLE,       // This notification uses a custom window message.
    		0,
    		&nc,
    		&g_hNotify[0]
    	);
    
    	if (FAILED(hr))
    	{
    		printf("error reg 1\n");
    		goto Error;
    	}
    
    	///////////////////////////////////////////////////////////////////////
    
    	nc.ctComparisonType = REG_CT_ANYCHANGE;
    	nc.dwMask           = SN_WIFISTATEHARDWAREPRESENT_BITMASK;
    	nc.TargetValue.dw   = 0;
    
    	hr = RegistryNotifyWindow(
    		SN_WIFISTATEHARDWAREPRESENT_ROOT,
    		SN_WIFISTATEHARDWAREPRESENT_PATH,
    		SN_WIFISTATEHARDWAREPRESENT_VALUE,
    		g_hCurWndDialog, 
    		WM_CHANGE_WIFI_PRESENT,       // This notification uses a custom window message.
    		0,
    		&nc,
    		&g_hNotify[1]
    	);
    
    	if (FAILED(hr))
    	{
    		printf("error reg 2\n");
    		goto Error;
    	}
    
    	///////////////////////////////////////////////////////////////////////
    
    	nc.ctComparisonType = REG_CT_ANYCHANGE;
    	nc.dwMask           = SN_WIFISTATEPOWERON_BITMASK;
    	nc.TargetValue.dw   = 0;
    
    	hr = RegistryNotifyWindow(
    		SN_WIFISTATEPOWERON_ROOT,
    		SN_WIFISTATEPOWERON_PATH,
    		SN_WIFISTATEPOWERON_VALUE,
    		g_hCurWndDialog, 
    		WM_CHANGE_WIFI_POWERON,       // This notification uses a custom window message.
    		0,
    		&nc,
    		&g_hNotify[2]
    	);
    
    	if (FAILED(hr))
    	{
    		printf("error reg 3\n");
    		goto Error;
    	}
    
    	///////////////////////////////////////////////////////////////////////
    
    	nc.ctComparisonType = REG_CT_ANYCHANGE;
    	nc.dwMask           = SN_WIFISTATECONNECTING_BITMASK;
    	nc.TargetValue.dw   = 0;
    
    	hr = RegistryNotifyWindow(
    		SN_WIFISTATECONNECTING_ROOT,
    		SN_WIFISTATECONNECTING_PATH,
    		SN_WIFISTATECONNECTING_VALUE,
    		g_hCurWndDialog, 
    		WM_CHANGE_WIFI_CONNECTING,       // This notification uses a custom window message.
    		0,
    		&nc,
    		&g_hNotify[3]
    	);
    
    	if (FAILED(hr))
    	{
    		printf("error reg 4\n");
    		goto Error;
    	}
    
    	///////////////////////////////////////////////////////////////////////
    
    	nc.ctComparisonType = REG_CT_ANYCHANGE;
    	nc.dwMask           = SN_WIFISTATECONNECTED_BITMASK;
    	nc.TargetValue.dw   = 0;
    
    	hr = RegistryNotifyWindow(
    		SN_WIFISTATECONNECTED_ROOT,
    		SN_WIFISTATECONNECTED_PATH,
    		SN_WIFISTATECONNECTED_VALUE,
    		g_hCurWndDialog, 
    		WM_CHANGE_WIFI_CONNECTED,       // This notification uses a custom window message.
    		0,
    		&nc,
    		&g_hNotify[4]
    	);
    
    	if (FAILED(hr))
    	{
    		printf("error reg 5\n");
    		goto Error;
    	}
    
    
    	printf("reg ok\n");
    
    Error:
    	return hr;
    }
    
    
    
    
    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPTSTR    lpCmdLine,
                       int       nCmdShow)
    {
    	MSG msg;
    
    	// 응용 프로그램 초기화를 수행합니다.
    	if (!InitInstance(hInstance, nCmdShow)) 
    	{
    		return FALSE;
    	}
    
    	HACCEL hAccelTable;
    	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIFIAVAILABLE));
    
    	// 기본 메시지 루프입니다.
    	while (GetMessage(&msg, NULL, 0, 0)) 
    	{
    		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
    		{
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
    	}
    
    	return (int) msg.wParam;
    }
    
    //
    //  함수: MyRegisterClass()
    //
    //  목적: 창 클래스를 등록합니다.
    //
    //  설명:
    //
    ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass)
    {
    	WNDCLASS wc;
    
    	wc.style         = CS_HREDRAW | CS_VREDRAW;
    	wc.lpfnWndProc   = WndProc;
    	wc.cbClsExtra    = 0;
    	wc.cbWndExtra    = 0;
    	wc.hInstance     = hInstance;
    	wc.hIcon         = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIFIAVAILABLE));
    	wc.hCursor       = 0;
    	wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    	wc.lpszMenuName  = 0;
    	wc.lpszClassName = szWindowClass;
    
    	return RegisterClass(&wc);
    }
    
    //
    //   함수: InitInstance(HINSTANCE, int)
    //
    //   목적: 인스턴스 핸들을 저장하고 주 창을 만듭니다.
    //
    //   설명:
    //
    //        이 함수를 통해 인스턴스 핸들을 전역 변수에 저장하고
    //        주 프로그램 창을 만든 다음 표시합니다.
    //
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
        HWND hWnd;
        TCHAR szTitle[MAX_LOADSTRING];		// 제목 표시줄 텍스트
        TCHAR szWindowClass[MAX_LOADSTRING];	// 주 창 클래스 이름
    
        g_hInst = hInstance; // 인스턴스 핸들을 전역 변수에 저장합니다.
    
        // CAPEDIT 및 SIPPREF와 같은 모든 장치 특수 컨트롤을 초기화하기 위해
        // 응용 프로그램을 초기화하는 동안 SHInitExtraControls를 한 번 호출해야 합니다.
        SHInitExtraControls();
    
        LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); 
        LoadString(hInstance, IDC_WIFIAVAILABLE, szWindowClass, MAX_LOADSTRING);
    
        //이미 실행 중인 경우 창에 포커스를 둔 다음 끝냅니다.
        hWnd = FindWindow(szWindowClass, szTitle);	
        if (hWnd) 
        {
            // 맨 앞 자식 창에 포커스를 설정합니다.
            // "| 0x00000001"을 사용하여 소유한 모든 창을 전경으로 보낸 다음
            // 활성화합니다.
            SetForegroundWindow((HWND)((ULONG) hWnd | 0x00000001));
            return 0;
        } 
    
        if (!MyRegisterClass(hInstance, szWindowClass))
        {
        	return FALSE;
        }
    
        hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE,
            CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
    
        if (!hWnd)
        {
            return FALSE;
        }
    
    	g_hCurWndDialog = hWnd;
    
    
        // CW_USEDEFAULT를 사용하여 주 창을 만드는 경우 메뉴 모음의 높이는
        // 고려되지 않습니다. 따라서 메뉴 모음이 있는 경우
        // 창을 만든 후 창의 크기를 조정합니다.
        if (g_hWndMenuBar)
        {
            RECT rc;
            RECT rcMenuBar;
    
            GetWindowRect(hWnd, &rc);
            GetWindowRect(g_hWndMenuBar, &rcMenuBar);
            rc.bottom -= (rcMenuBar.bottom - rcMenuBar.top);
    		
            MoveWindow(hWnd, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, FALSE);
        }
    
        ShowWindow(hWnd, nCmdShow);
        UpdateWindow(hWnd);
    
    	RegisterWindows();
    
        return TRUE;
    }
    
    //
    //  함수: WndProc(HWND, UINT, WPARAM, LPARAM)
    //
    //  목적: 주 창의 메시지를 처리합니다.
    //
    //  WM_COMMAND	- 응용 프로그램 메뉴를 처리합니다.
    //  WM_PAINT	- 주 창을 그립니다.
    //  WM_DESTROY	- 종료 메시지를 게시하고 반환합니다.
    //
    //
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        int wmId, wmEvent;
        PAINTSTRUCT ps;
        HDC hdc;
    
        static SHACTIVATEINFO s_sai;
    	
        switch (message) 
        {
            case WM_COMMAND:
                wmId    = LOWORD(wParam); 
                wmEvent = HIWORD(wParam); 
                // 메뉴의 선택 영역을 구문 분석합니다.
                switch (wmId)
                {
                    case IDM_HELP_ABOUT:
                        DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, About);
                        break;
                    case IDM_OK:
                        SendMessage (hWnd, WM_CLOSE, 0, 0);				
                        break;
                    default:
                        return DefWindowProc(hWnd, message, wParam, lParam);
                }
                break;
    
            case WM_CREATE:
                SHMENUBARINFO mbi;
    
                memset(&mbi, 0, sizeof(SHMENUBARINFO));
                mbi.cbSize     = sizeof(SHMENUBARINFO);
                mbi.hwndParent = hWnd;
                mbi.nToolBarId = IDR_MENU;
                mbi.hInstRes   = g_hInst;
    
                if (!SHCreateMenuBar(&mbi)) 
                {
                    g_hWndMenuBar = NULL;
                }
                else
                {
                    g_hWndMenuBar = mbi.hwndMB;
                }
    
                // 셸 활성화 정보 구조 초기화
                memset(&s_sai, 0, sizeof (s_sai));
                s_sai.cbSize = sizeof (s_sai);
                break;
            case WM_PAINT:
                hdc = BeginPaint(hWnd, &ps);
                
                // TODO: 여기에 그리기 코드를 추가합니다.
                
                EndPaint(hWnd, &ps);
                break;
            case WM_DESTROY:
                CommandBar_Destroy(g_hWndMenuBar);
                PostQuitMessage(0);
                break;
    
            case WM_ACTIVATE:
                // 활성화 메시지를 셸에 알립니다.
                SHHandleWMActivate(hWnd, wParam, lParam, &s_sai, FALSE);
                break;
    
            case WM_SETTINGCHANGE:
                SHHandleWMSettingChange(hWnd, wParam, lParam, &s_sai);
                break;
    
    		case WM_CHANGE_WIFI_AVAILABLE:
    			printf("wifi available\n");
    			//::MessageBox(NULL, L"WIFI AVAILABLE", L"OK", MB_OK);
    			break;
    
    		case WM_CHANGE_WIFI_PRESENT:
    			printf("wifi present\n");
    			//::MessageBox(NULL, L"WIFI PRESENT", L"OK", MB_OK);
    			break;
    
    		case WM_CHANGE_WIFI_POWERON:
    			printf("wifi power on\n");
    			//::MessageBox(NULL, L"WIFI power on", L"OK", MB_OK);
    			break;
    		case WM_CHANGE_WIFI_CONNECTING:
    			printf("wifi power CONNECTING\n");
    			//::MessageBox(NULL, L"WIFI power on", L"OK", MB_OK);
    			break;
    		case WM_CHANGE_WIFI_CONNECTED:
    			printf("wifi power CONNECTED\n");
    			//::MessageBox(NULL, L"WIFI power on", L"OK", MB_OK);
    			break;
    
    
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
    }
    
    // 정보 대화 상자의 메시지 처리기입니다.
    INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)
        {
            case WM_INITDIALOG:
                {
                    // [완료] 단추를 만들고 크기를 조정합니다.  
                    SHINITDLGINFO shidi;
                    shidi.dwMask = SHIDIM_FLAGS;
                    shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN | SHIDIF_EMPTYMENU;
                    shidi.hDlg = hDlg;
                    SHInitDialog(&shidi);
                }
                return (INT_PTR)TRUE;
    
            case WM_COMMAND:
                if (LOWORD(wParam) == IDOK)
                {
                    EndDialog(hDlg, LOWORD(wParam));
                    return TRUE;
                }
                break;
    
            case WM_CLOSE:
                EndDialog(hDlg, message);
                return TRUE;
    
        }
        return (INT_PTR)FALSE;
    }
    

    Comment


    입력하3 1498664985



    Locations of visitors to this page