본문 바로가기

Programming/WinAPI

WinAPI 메크로 소스

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT("Macro");

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
                     ,LPSTR lpszCmdParam,int nCmdShow)
{
    HWND hWnd;
    MSG Message;
    WNDCLASS WndClass;
    g_hInst=hInstance;

    WndClass.cbClsExtra=0;
    WndClass.cbWndExtra=0;
    WndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
    WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    WndClass.hInstance=hInstance;
    WndClass.lpfnWndProc=WndProc;
    WndClass.lpszClassName=lpszClass;
    WndClass.lpszMenuName=NULL;
    WndClass.style=CS_HREDRAW | CS_VREDRAW;
    RegisterClass(&WndClass);

    hWnd=CreateWindowEx(WS_EX_TOPMOST, lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,CW_USEDEFAULT,155,135,
        NULL,(HMENU)NULL,hInstance,NULL);
    ShowWindow(hWnd,nCmdShow);

    while (GetMessage(&Message,NULL,0,0)) {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }
    return (int)Message.wParam;
}

#define ID_COMBOBOX1 100
#define ID_COMBOBOX2 101

TCHAR *Items1[]={TEXT("마우스 왼쪽"), // 0~1 : 마우스
TEXT("마우스 오른쪽"),
TEXT("Space"), // 2~4, 41~49 : 특수키
TEXT("Enter"),
TEXT("BackSpace"),
TEXT("0"),TEXT("1"),TEXT("2"),TEXT("3"),TEXT("4"), // 5~14 : 숫자
TEXT("5"),TEXT("6"),TEXT("7"),TEXT("8"),TEXT("9"),
TEXT("A"),TEXT("B"),TEXT("C"),TEXT("D"),TEXT("E"), // 15~40 : 문자
TEXT("F"),TEXT("G"),TEXT("H"),TEXT("I"),TEXT("J"),
TEXT("K"),TEXT("L"),TEXT("M"),TEXT("N"),TEXT("O"),
TEXT("P"),TEXT("Q"),TEXT("R"),TEXT("S"),TEXT("T"),
TEXT("U"),TEXT("V"),TEXT("W"),TEXT("X"),TEXT("Y"),
TEXT("Z"),
TEXT("F2"),TEXT("F3"),TEXT("F4"),TEXT("F5"),TEXT("F6"),
TEXT("F7"),TEXT("F8"),TEXT("F9"),TEXT("F10")};
int NumItems1 = 50;

TCHAR *Items2[]={TEXT("없이"),TEXT("Ctrl"),TEXT("Alt"),TEXT("Shift"),
TEXT("Ctrl+Alt"),
TEXT("Ctrl+Shift"),
TEXT("Alt+Shift")};
int NumItems2 = 7;

HWND hScroll;
HWND hCombo1;
HWND hCombo2;

int Speed;

//-------------------------
HWND hWndPoint;
POINT Pt;

void ChangeHandle(){

    GetCursorPos(&Pt);
    hWndPoint=WindowFromPoint(Pt);
    ScreenToClient(hWndPoint, &Pt);

}
//--------------------------

//---------------------------------------------------------------------------
WPARAM MyWPARAM = NULL;
LPARAM MyLPARAM = NULL;
TCHAR *c = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int Index;

enum MyMessages{LBUTTON, RBUTTON, VKEYBOARD, KEYBOARD};
MyMessages MyMessage = LBUTTON;

enum MessageList{MOUSELEFT, MOUSERIGHT, SPACE, ENTER, BACKSPACE,
F2 = 41, F3, F4, F5, F6, F7, F8, F9, F10};

void ChangeKey1(){

    int i;

    i = SendMessage(hCombo1, CB_GETCURSEL,0,0);

    switch ( i ){
        case MOUSELEFT:
            if( MyMessage == KEYBOARD ){
                MyWPARAM = NULL;
            }
            MyMessage = LBUTTON;
            return;
        case MOUSERIGHT:
            if( MyMessage == KEYBOARD ){
                MyWPARAM = NULL;
            }
            MyMessage = RBUTTON;
    return;
        case SPACE: MyWPARAM = VK_SPACE; MyMessage = VKEYBOARD; return;
        case ENTER: MyWPARAM = VK_RETURN; MyMessage = VKEYBOARD; return;
        case BACKSPACE: MyWPARAM = VK_BACK; MyMessage = VKEYBOARD; return;
        case F2: MyWPARAM = VK_F2; MyMessage = VKEYBOARD; return;
        case F3: MyWPARAM = VK_F3; MyMessage = VKEYBOARD; return;
        case F4: MyWPARAM = VK_F4; MyMessage = VKEYBOARD; return;
        case F5: MyWPARAM = VK_F5; MyMessage = VKEYBOARD; return;
        case F6: MyWPARAM = VK_F6; MyMessage = VKEYBOARD; return;
        case F7: MyWPARAM = VK_F7; MyMessage = VKEYBOARD; return;
        case F8: MyWPARAM = VK_F8; MyMessage = VKEYBOARD; return;
        case F9: MyWPARAM = VK_F9; MyMessage = VKEYBOARD; return;
        case F10: MyWPARAM = VK_F10; MyMessage = VKEYBOARD; return;
    }

    Index = i - 5;
    MyMessage = KEYBOARD;
    return;

}

void ChangeKey2(){

}
//----------------------------------------------------------------------

WNDPROC OldEditProc;
BOOL timerTF = FALSE;
BOOL changeHandleTF = TRUE;

enum TimerList {CHANGEHADLE, SENDMESSAGE};

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;

    int i;

    switch (iMessage) {
    case WM_CREATE:

        hWndMain=hWnd;

        // 스크롤
        hScroll=CreateWindow(TEXT("scrollbar"),NULL,WS_CHILD | WS_VISIBLE |
            SBS_HORZ,10,10,130,15,hWnd,(HMENU)0,g_hInst,NULL);
        Speed=500;
        SetScrollRange(hScroll,SB_CTL,0,1000,TRUE);
        SetScrollPos(hScroll,SB_CTL,Speed,TRUE);

        // 콤보1
        hCombo1=CreateWindow(TEXT("combobox"),NULL,WS_CHILD | WS_VISIBLE | WS_VSCROLL |
            CBS_DROPDOWNLIST,10,33,130,200,hWnd,(HMENU)ID_COMBOBOX1,g_hInst,NULL);
        for(i=0;i<NumItems1;i++){
            SendMessage(hCombo1, CB_ADDSTRING,0,(LPARAM)Items1[i]);
        }
        SendMessage(hCombo1, CB_SETCURSEL,0,0);

        // 콤보2
        hCombo2=CreateWindow(TEXT("combobox"),NULL,WS_CHILD | WS_VISIBLE |
            CBS_DROPDOWNLIST,10,63,130,200,hWnd,(HMENU)ID_COMBOBOX2,g_hInst,NULL);
        for(i=0;i<NumItems2;i++){
            SendMessage(hCombo2, CB_ADDSTRING,0,(LPARAM)Items2[i]);
        }
        SendMessage(hCombo2, CB_SETCURSEL,0,0);

        RegisterHotKey(hWnd,0x0000,0,VK_F1);
        RegisterHotKey(hWnd,0x0001,0,VK_F11);

        return 0;

    case WM_HOTKEY:
        switch( wParam ){
        case 0:
            if(timerTF){
                timerTF = FALSE;
                KillTimer(hWnd, 1);
            }
            else{
                timerTF = TRUE;
                SetTimer(hWnd, 1, Speed, NULL);
                SendMessage(hWnd, WM_TIMER, 1, 0);
            }
            break;
        case 1:
            if( timerTF ){
                if(changeHandleTF){
                    changeHandleTF = FALSE;
                }
                else{
                    changeHandleTF = TRUE;
                }
            }
            break;
        }
        return 0;
    case WM_HSCROLL:
        switch (LOWORD(wParam)) {
        case SB_LINELEFT:
            Speed=max(0,Speed-1);
            break;
        case SB_LINERIGHT:
            Speed=min(1000,Speed+1);
            break;
        case SB_PAGELEFT:
            Speed=max(0,Speed-10);
            break;
        case SB_PAGERIGHT:
            Speed=min(1000,Speed+10);
            break;
        case SB_THUMBTRACK:
            Speed=HIWORD(wParam);
            break;
            }
            if(timerTF){
                SetTimer(hWnd, 1, Speed, NULL);
            }
            SetScrollPos((HWND)lParam,SB_CTL,Speed,TRUE);
            InvalidateRect(hWnd,NULL,TRUE);
        return 0;
    case WM_TIMER:
        {

            if(changeHandleTF){
                ChangeHandle();
            }

            if( hWndPoint == hWnd || hWndPoint == hScroll ||
                hWndPoint == hCombo1 || hWndPoint == hCombo2 )
            {
                return 0;
            }

            switch (MyMessage){
            case LBUTTON:
                SendMessage(hWndPoint, WM_LBUTTONDOWN, MyWPARAM, MAKELPARAM(Pt.x, Pt.y));
                SendMessage(hWndPoint, WM_LBUTTONUP, MyWPARAM, MAKELPARAM(Pt.x, Pt.y));
                break;
            case RBUTTON:
                SendMessage(hWndPoint, WM_RBUTTONDOWN, MyWPARAM, MAKELPARAM(Pt.x, Pt.y));
                SendMessage(hWndPoint, WM_RBUTTONUP, MyWPARAM, MAKELPARAM(Pt.x, Pt.y));
                break;
            case VKEYBOARD:
                keybd_event(MyWPARAM, 0, 0, 0);
                keybd_event(MyWPARAM, 0, KEYEVENTF_KEYUP, 0);
                break;
            case KEYBOARD:
                keybd_event(c[Index], 0, 0, 0);
                keybd_event(c[Index], 0, KEYEVENTF_KEYUP, 0);
                break;
            }
        }
        return 0;
    case WM_COMMAND:
        if( HIWORD(wParam) == CBN_SELCHANGE ){
            switch (LOWORD(wParam)) {
    case ID_COMBOBOX1:
        ChangeKey1();
        break;
    case ID_COMBOBOX2:
        ChangeKey1();
        break;
            }
            SetFocus(hWnd);
        }
        return 0;
    case WM_PAINT:
        hdc=BeginPaint(hWnd, &ps);
        EndPaint(hWnd, &ps);
        return 0;
    case WM_DESTROY:
        UnregisterHotKey(hWnd, 0x0000);
        UnregisterHotKey(hWnd, 0x0001);
        PostQuitMessage(0);
        return 0;
    }
    return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

'Programming > WinAPI' 카테고리의 다른 글

DLL dwReason 관련 사이트  (0) 2013.03.22
ScreenToClient, ClientToScreen 함수  (0) 2013.02.13
Winapi 초기본(주석 有)  (0) 2012.11.16