Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2012, 10:39   #11
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Урок 14. Процесс --> http://wasm.ru/article.php?article=1001014

main.c
Код:
#include <windows.h>
#include <tchar.h>

LRESULT CALLBACK WindowProc(HWND hwnd,
                            UINT uMsg,
                            WPARAM wParam,
                            LPARAM lParam);

HMENU hMenu;

LPCTSTR ClassName = _T("Win32_C_ProcessClass");
LPCTSTR AppName = _T("Win32 C Process Example");
LPCTSTR MenuName = _T("FirstMenu");

int WINAPI _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR lpCmdLine,
                     int nCmdShow)
{
    WNDCLASSEX wc;
    MSG msg;
    HWND hwnd;

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
    wc.lpszMenuName = MenuName;
    wc.lpszClassName = ClassName;
    wc.hIconSm = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION);

    if (RegisterClassEx(&wc) == 0) {
        MessageBox(NULL, _T("Cannot regiser window class"), _T("Error"), MB_ICONERROR);
        return FALSE;
    }

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,
                          ClassName,
                          AppName,
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          300,
                          200,
                          (HWND) NULL,
                          (HMENU) NULL,
                          hInstance,
                          NULL);

    if (hwnd == NULL) {
        MessageBox(NULL, _T("Cannot create window"), _T("Error"), MB_ICONERROR);
        return FALSE;
    }

    ShowWindow(hwnd, SW_SHOWNORMAL);
    UpdateWindow(hwnd);

    hMenu = GetMenu(hwnd);

    while(GetMessage(&msg, NULL, 0, 0) != 0) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

#define IDM_CREATE_PROCESS 1
#define IDM_TERMINATE 2
#define IDM_EXIT 3

PROCESS_INFORMATION processInfo;
STARTUPINFO startInfo;
DWORD ExitCode;

LPCTSTR programname = _T("msgbox.exe");

LRESULT CALLBACK WindowProc(HWND hWnd,
                            UINT uMsg,
                            WPARAM wParam,
                            LPARAM lParam)
{
    switch(uMsg) {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_INITMENUPOPUP:
        if (GetExitCodeProcess(processInfo.hProcess, &ExitCode)) {
            if (ExitCode == STILL_ACTIVE) {
                EnableMenuItem(hMenu, IDM_CREATE_PROCESS, MF_GRAYED);
                EnableMenuItem(hMenu, IDM_TERMINATE, MF_ENABLED);
            }
            else {
                EnableMenuItem(hMenu, IDM_CREATE_PROCESS, MF_ENABLED);
                EnableMenuItem(hMenu, IDM_TERMINATE, MF_GRAYED);
            }
        }
        else {
            EnableMenuItem(hMenu, IDM_CREATE_PROCESS, MF_ENABLED);
            EnableMenuItem(hMenu, IDM_TERMINATE, MF_GRAYED);
        }
        break;
    case WM_COMMAND:
        if (lParam == 0) {
            if (LOWORD(wParam) == IDM_CREATE_PROCESS) {
                if (processInfo.hProcess != 0) {
                    CloseHandle(processInfo.hProcess);
                    processInfo.hProcess = 0;
                }
                GetStartupInfo(&startInfo);
                CreateProcess(programname, NULL, NULL, NULL, FALSE,
                              NORMAL_PRIORITY_CLASS, NULL, NULL,
                              &startInfo, &processInfo);
                CloseHandle(processInfo.hThread);
            }
            else if (LOWORD(wParam) == IDM_TERMINATE) {
                GetExitCodeProcess(processInfo.hProcess, &ExitCode);
                if (ExitCode == STILL_ACTIVE) {
                    TerminateProcess(processInfo.hProcess, 0);
                }
                CloseHandle(processInfo.hProcess);
            }
            else {
                DestroyWindow(hWnd);
                processInfo.hProcess = 0;
            }
        }
        break;
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

    return 0;
}
process.rc
Код:
// Constants for menu
#define IDM_CREATE_PROCESS 1
#define IDM_TERMINATE 2
#define IDM_EXIT 3

FirstMenu MENU
{
    POPUP "&Process"
    {
        MENUITEM "&Create Process", IDM_CREATE_PROCESS
        MENUITEM "&Terminate Process", IDM_TERMINATE
        MENUITEM SEPARATOR
        MENUITEM "E&xit", IDM_EXIT
    }
}

Последний раз редактировалось 8Observer8; 30.05.2012 в 11:04.
8Observer8 вне форума Ответить с цитированием
Старый 30.05.2012, 13:36   #12
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Урок 15. Треды (ветви) --> http://wasm.ru/article.php?article=1001015

main.c
Код:
#include <windows.h>
#include <tchar.h>

LRESULT CALLBACK WindowProc(HWND hwnd,
                            UINT uMsg,
                            WPARAM wParam,
                            LPARAM lParam);

HMENU hMenu;
HWND hwnd;

LPCTSTR ClassName = _T("Win32_C_ThreadClass");
LPCTSTR AppName = _T("Win32 C MultiThreading Example");
LPCTSTR MenuName = _T("FirstMenu");

int WINAPI _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR lpCmdLine,
                     int nCmdShow)
{
    WNDCLASSEX wc;
    MSG msg;

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
    wc.lpszMenuName = MenuName;
    wc.lpszClassName = ClassName;
    wc.hIconSm = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION);

    if (RegisterClassEx(&wc) == 0) {
        MessageBox(NULL, _T("Cannot regiser window class"), _T("Error"), MB_ICONERROR);
        return FALSE;
    }

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,
                          ClassName,
                          AppName,
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          300,
                          200,
                          (HWND) NULL,
                          (HMENU) NULL,
                          hInstance,
                          NULL);

    if (hwnd == NULL) {
        MessageBox(NULL, _T("Cannot create window"), _T("Error"), MB_ICONERROR);
        return FALSE;
    }

    ShowWindow(hwnd, SW_SHOWNORMAL);
    UpdateWindow(hwnd);

    hMenu = GetMenu(hwnd);

    while(GetMessage(&msg, NULL, 0, 0) != 0) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

#define IDM_CREATE_THREAD 1
#define IDM_EXIT 2
#define WM_FINISH WM_USER+0x0100

DWORD WINAPI ThreadProc(LPVOID lpParameter);

DWORD ExitCode;
DWORD ThreadID;
HANDLE hThread;

LRESULT CALLBACK WindowProc(HWND hWnd,
                            UINT uMsg,
                            WPARAM wParam,
                            LPARAM lParam)
{
    switch(uMsg) {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_COMMAND:
        if (lParam == 0) {
            if (LOWORD(wParam) == IDM_CREATE_THREAD) {
                hThread = CreateThread(NULL, (SIZE_T) NULL, ThreadProc, NULL,
                                       NORMAL_PRIORITY_CLASS, &ThreadID);
                CloseHandle(hThread);
            }
            else {
                DestroyWindow(hWnd);
            }
        }
        break;
    case WM_FINISH:
        MessageBox(NULL, AppName, AppName, MB_OK);
        break;
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

    return 0;
}

DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
    int i;

    for(i = 0; i < 300000000; i++) {
        ;
    }

    return SendMessage(hwnd, WM_FINISH, (WPARAM) NULL, (LPARAM) NULL);
}
thread.rc
Код:
// Constants for menu
#define IDM_CREATE_THREAD 1
#define IDM_EXIT 2

FirstMenu MENU
{
    POPUP "&Process"
    {
        MENUITEM "&Create Thread", IDM_CREATE_THREAD
        MENUITEM SEPARATOR
        MENUITEM "E&xit", IDM_EXIT
    }
}
8Observer8 вне форума Ответить с цитированием
Старый 01.06.2012, 06:57   #13
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Урок 16. Объект события --> http://wasm.ru/article.php?article=1001016

main.c
Код:
#include <windows.h>
#include <tchar.h>

LRESULT CALLBACK WindowProc(HWND hwnd,
                            UINT uMsg,
                            WPARAM wParam,
                            LPARAM lParam);

HMENU hMenu;
HWND hwnd;

LPCTSTR ClassName = _T("Win32_C_EventClass");
LPCTSTR AppName = _T("Win32 C Event Example");
LPCTSTR MenuName = _T("FirstMenu");

int WINAPI _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR lpCmdLine,
                     int nCmdShow)
{
    WNDCLASSEX wc;
    MSG msg;

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
    wc.lpszMenuName = MenuName;
    wc.lpszClassName = ClassName;
    wc.hIconSm = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION);

    if (RegisterClassEx(&wc) == 0) {
        MessageBox(NULL, _T("Cannot regiser window class"), _T("Error"), MB_ICONERROR);
        return FALSE;
    }

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,
                          ClassName,
                          AppName,
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          300,
                          200,
                          (HWND) NULL,
                          (HMENU) NULL,
                          hInstance,
                          NULL);

    if (hwnd == NULL) {
        MessageBox(NULL, _T("Cannot create window"), _T("Error"), MB_ICONERROR);
        return FALSE;
    }

    ShowWindow(hwnd, SW_SHOWNORMAL);
    UpdateWindow(hwnd);

    hMenu = GetMenu(hwnd);

    while(GetMessage(&msg, NULL, 0, 0) != 0) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

#define IDM_START_THREAD 1
#define IDM_STOP_THREAD 2
#define IDM_EXIT 3
#define WM_FINISH WM_USER+0x0100

DWORD WINAPI ThreadProc(LPVOID lpParameter);

DWORD ExitCode;
DWORD ThreadID;
HANDLE hThread;
HANDLE hEventStart;
BOOL EventStop = FALSE;

LPCTSTR SuccessString = _T("The calculation is completed!");

LRESULT CALLBACK WindowProc(HWND hWnd,
                            UINT uMsg,
                            WPARAM wParam,
                            LPARAM lParam)
{
    switch(uMsg) {
    case WM_CREATE:
        hEventStart = CreateEvent(NULL, FALSE, FALSE, NULL);
        hThread = CreateThread(NULL, (SIZE_T) NULL, ThreadProc, NULL,
                               NORMAL_PRIORITY_CLASS, &ThreadID);
        CloseHandle(hThread);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_COMMAND:
        if (lParam == 0) {
            if (LOWORD(wParam) == IDM_START_THREAD) {
                SetEvent(hEventStart);
                EnableMenuItem(hMenu,IDM_START_THREAD, MF_GRAYED);
                EnableMenuItem(hMenu, IDM_STOP_THREAD, MF_ENABLED);
            }
            else if (LOWORD(wParam) == IDM_STOP_THREAD) {
                EventStop = TRUE;
                EnableMenuItem(hMenu, IDM_START_THREAD, MF_ENABLED);
                EnableMenuItem(hMenu,IDM_STOP_THREAD, MF_GRAYED);
            }
            else {
                DestroyWindow(hWnd);
            }
        }
        break;
    case WM_FINISH:
        MessageBox(NULL, SuccessString, AppName, MB_OK);
        break;
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

    return 0;
}

LPCTSTR StopString = _T("The thread is stopped");

DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
    int i;
    
    while (TRUE) {
label:
        WaitForSingleObject(hEventStart, INFINITE);

        for(i = 0; i < 600000000; i++) {
            if (EventStop == TRUE) {
                MessageBox(hwnd, StopString, AppName, MB_OK);
                EventStop = FALSE;
                goto label;
            }
        }

        PostMessage(hwnd, WM_FINISH, (WPARAM) NULL, (LPARAM) NULL);
        EnableMenuItem(hMenu, IDM_START_THREAD, MF_ENABLED);
        EnableMenuItem(hMenu,IDM_STOP_THREAD,MF_GRAYED);
    }

    return 0;
}
Код:
// Constants for menu
#define IDM_START_THREAD 1
#define IDM_STOP_THREAD 2
#define IDM_EXIT 3

FirstMenu MENU
{
    POPUP "&Thread"
    {
        MENUITEM "&Run Thread", IDM_START_THREAD
        MENUITEM "&Stop Thread", IDM_STOP_THREAD, GRAYED
        MENUITEM SEPARATOR
        MENUITEM "E&xit", IDM_EXIT
    }
}
8Observer8 вне форума Ответить с цитированием
Старый 01.06.2012, 12:27   #14
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Урок 18. Common Control'ы --> http://wasm.ru/article.php?article=1001018

main.c
Код:
#include <windows.h>
#include <tchar.h>
#include <commctrl.h>

LRESULT CALLBACK WindowProc( HWND hwnd,
                             UINT uMsg,
                             WPARAM wParam,
                             LPARAM lParam
                           );

HINSTANCE hInstance;

LPCTSTR ClassName = _T("CommonControlWinClass");
LPCTSTR AppName = _T("Common Control Demo");

int WINAPI _tWinMain( HINSTANCE hInst,
                      HINSTANCE hPrevInstance,
                      LPTSTR lpCmdLine,
                      int nCmdShow
                    )
{
    WNDCLASSEX wc;
    MSG msg;
    HWND hwnd;

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    hInstance = hInst;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = ClassName;
    wc.hIconSm = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION);

    if (RegisterClassEx(&wc) == 0) {
        MessageBox(NULL, _T("Cannot regiser window class"), _T("Error"), MB_ICONERROR);
        return FALSE;
    }

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,
                          ClassName,
                          AppName,
                          WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX |
                          WS_MAXIMIZEBOX | WS_VISIBLE,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          300,
                          200,
                          (HWND) NULL,
                          (HMENU) NULL,
                          hInstance,
                          NULL);

    if (hwnd == NULL) {
        MessageBox(NULL, _T("Cannot create window"), _T("Error"), MB_ICONERROR);
        return FALSE;
    }

    ShowWindow(hwnd, SW_SHOWNORMAL);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0) != 0) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

#define IDC_PROGRESS 1
#define IDC_STATUS 2
#define IDC_TIMER 3

DWORD TimerID;
HWND hwndProgress;
HWND hwndStatus;
UINT CurrentStep;

LPCTSTR ProgressClass = _T("msctls_progress32");
LPCTSTR Message = _T("Finished!");

LRESULT CALLBACK WindowProc( HWND hWnd,
                             UINT uMsg,
                             WPARAM wParam,
                             LPARAM lParam
                           )
{
    switch(uMsg) {
    case WM_CREATE:
        hwndProgress = CreateWindowEx((DWORD) NULL,
                                      ProgressClass,
                                      (LPCTSTR) NULL,
                                      WS_CHILD | WS_VISIBLE,
                                      50, 70,
                                      200, 20,
                                      hWnd,
                                      (HMENU) IDC_PROGRESS,
                                      hInstance,
                                      NULL);
        CurrentStep = 1000;
        SendMessage(hwndProgress, PBM_SETRANGE, 0, CurrentStep << 16);
        SendMessage(hwndProgress, PBM_SETSTEP, 10, 0);
        hwndStatus = CreateStatusWindow(WS_CHILD | WS_VISIBLE, NULL, hWnd, IDC_STATUS);
        TimerID = SetTimer(hWnd, IDC_TIMER, 100, NULL);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        if (TimerID != 0) {
            KillTimer(hWnd, TimerID);
        }
        break;
    case WM_TIMER:
        SendMessage(hwndProgress, PBM_STEPIT, 0, 0);
        CurrentStep -= 10;
        if (CurrentStep == 0) {
            KillTimer(hWnd, TimerID);
            TimerID = 0;
            SendMessage(hwndStatus, SB_SETTEXT, 0, (LPARAM) Message);
            MessageBox(hWnd, Message, AppName, MB_OK | MB_ICONINFORMATION);
            SendMessage(hwndStatus, SB_SETTEXT, 0, 0);
            SendMessage(hwndProgress, PBM_SETPOS, 0, 0);
        }
        break;
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

    return 0;
}

Последний раз редактировалось 8Observer8; 01.06.2012 в 12:56.
8Observer8 вне форума Ответить с цитированием
Старый 02.06.2012, 19:34   #15
VladimirVB
Форумчанин
 
Аватар для VladimirVB
 
Регистрация: 12.10.2008
Сообщений: 131
По умолчанию

Если кому-то интересно могу перевести уроки Iczelion'а о Win32 API на Delphi.
VladimirVB вне форума Ответить с цитированием
Старый 02.06.2012, 20:30   #16
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от VladimirVB Посмотреть сообщение
Если кому-то интересно могу перевести уроки Iczelion'а о Win32 API на Delphi.
Мне интересно! У меня было и есть желание начать изучать Delphi! Но, пожалуйста, не в этой теме! Так как название не будет соответствовать. Да и путаница получится.

Тема от VladimirVB: "Переписываем уроки Iczelion'а о Win32 API на Delphi" --> http://programmersforum.ru/showthread.php?t=203544

Последний раз редактировалось 8Observer8; 02.06.2012 в 22:06. Причина: добавил ссылку.
8Observer8 вне форума Ответить с цитированием
Старый 02.06.2012, 20:48   #17
VladimirVB
Форумчанин
 
Аватар для VladimirVB
 
Регистрация: 12.10.2008
Сообщений: 131
По умолчанию

Хорошо, открою новую тему.
VladimirVB вне форума Ответить с цитированием
Старый 02.06.2012, 21:51   #18
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Урок 20. Сабклассинг окна --> http://wasm.ru/article.php?article=1001020

main.c
Код:
#include <windows.h>
#include <tchar.h>

LRESULT CALLBACK WindowProc( HWND hwnd,
                             UINT uMsg,
                             WPARAM wParam,
                             LPARAM lParam
                           );

INT_PTR CALLBACK EditWndProc( HWND hEdit,
                              UINT uMsg,
                              WPARAM wParam,
                              LPARAM lParam
                            );

HINSTANCE hInstance;

LPCTSTR ClassName = _T("SubclassWinClass");
LPCTSTR AppName = _T("Subclassing Demo");

int WINAPI _tWinMain( HINSTANCE hInst,
                      HINSTANCE hPrevInstance,
                      LPTSTR lpCmdLine,
                      int nCmdShow
                    )
{
    WNDCLASSEX wc;
    MSG msg;
    HWND hwnd;

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    hInstance = hInst;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = ClassName;
    wc.hIconSm = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION);

    if (RegisterClassEx(&wc) == 0) {
        MessageBox(NULL, _T("Cannot regiser window class"), _T("Error"), MB_ICONERROR);
        return FALSE;
    }

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,
                          ClassName,
                          AppName,
                          WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX |
                          WS_MAXIMIZEBOX | WS_VISIBLE,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          350,
                          200,
                          (HWND) NULL,
                          (HMENU) NULL,
                          hInstance,
                          NULL);

    if (hwnd == NULL) {
        MessageBox(NULL, _T("Cannot create window"), _T("Error"), MB_ICONERROR);
        return FALSE;
    }

    ShowWindow(hwnd, SW_SHOWNORMAL);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0) != 0) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

HWND hwndEdit;
long OldWndProc;

LPCTSTR EditClass = _T("EDIT");
LPCTSTR Message = _T("You pressed the Enter key in the text box!");

LRESULT CALLBACK WindowProc( HWND hWnd,
                             UINT uMsg,
                             WPARAM wParam,
                             LPARAM lParam
                           )
{
    switch(uMsg) {
    case WM_CREATE:
        hwndEdit = CreateWindowEx(WS_EX_CLIENTEDGE,
                                  EditClass,
                                  NULL,
                                  WS_CHILD | WS_VISIBLE+WS_BORDER,
                                  20, 20,
                                  300, 25,
                                  hWnd,
                                  (HMENU) NULL,
                                  hInstance,
                                  NULL);
        SetFocus(hWnd);
        OldWndProc = SetWindowLong(hwndEdit, GWL_WNDPROC, (LONG) EditWndProc);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

    return 0;
}

INT_PTR CALLBACK EditWndProc( HWND hEdit,
                              UINT uMsg,
                              WPARAM wParam,
                              LPARAM lParam
                            )
{
    switch(uMsg) {
    case WM_CHAR:
        if (('0' <= LOWORD(wParam)) && (LOWORD(wParam) <= '9') ||
            ('A' <= LOWORD(wParam)) && (LOWORD(wParam) <= 'F') ||
            ('a' <= LOWORD(wParam)) && (LOWORD(wParam) <= 'f') ||
            (LOWORD(wParam) == VK_BACK)) {
                if (('a' <= LOWORD(wParam)) && (LOWORD(wParam) <= 'f')) {
                    wParam = LOWORD(wParam) - 0x020;                
                }
        }
        else {
            return 0;
        }
        break;
    case WM_KEYDOWN:
        if (LOWORD(wParam) == VK_RETURN) {
            MessageBox(hEdit, Message, AppName, MB_OK | MB_ICONINFORMATION);
            SetFocus(hEdit);
        }
        else {
            return 0;
        }
        break;
    }
        
    return CallWindowProc((WNDPROC) OldWndProc, hEdit, uMsg, wParam, lParam);
}
8Observer8 вне форума Ответить с цитированием
Старый 02.06.2012, 23:05   #19
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Урок 17. Динамические библиотеки --> http://wasm.ru/article.php?article=1001017

main.c
Код:
#include <windows.h>
#include <tchar.h>

void (*TestHello)(void);

LPCTSTR LibName = _T("DLLSkeleton.dll");
LPCSTR FunctionName = "TestHello";
LPCTSTR DllNotFound = _T("Cannot load library");
LPCTSTR AppName = _T("Load Library");
LPCTSTR FunctionNotFound = _T("TestHello function not found");

HMODULE hLib;
FARPROC TestHelloAddr;

int WINAPI _tWinMain( HINSTANCE hInstance,
                      HINSTANCE hPrevInstance,
                      LPTSTR lpCmdLine,
                      int nCmdShow
                    )
{
    hLib = LoadLibrary(LibName);
    if (hLib == NULL) {
        MessageBox(NULL, DllNotFound, AppName, MB_OK);
        return FALSE;
    }

    TestHelloAddr = GetProcAddress(hLib, FunctionName);
    if (TestHelloAddr == NULL) {
        MessageBox(NULL, FunctionNotFound, AppName, MB_OK);
        return FALSE;
    }

    TestHello = (void(*)(void))TestHelloAddr;

    (*TestHello)();

    FreeLibrary(hLib);

    return TRUE;
}
DLLSkeleton.dll
Код:
#include <windows.h>
#include <tchar.h>

__declspec(dllexport) void __cdecl TestHello(void);

LPCTSTR AppName = _T("DLL Skeleton");
LPCTSTR HelloMsg = _T("Hello, you're calling a function in this DLL");
LPCTSTR LoadMsg = _T("The DLL is loaded");
LPCTSTR UnloadMsg = _T("The DLL is unloaded");
LPCTSTR ThreadCreated = _T("A thread is created in this process");
LPCTSTR ThreadDestroyed = _T("A thread is destroyed in this process");

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
        MessageBox(NULL, LoadMsg, AppName, MB_OK);
        break;
    case DLL_THREAD_ATTACH:
        MessageBox(NULL, UnloadMsg, AppName, MB_OK);
	    break;
    case DLL_THREAD_DETACH:
        MessageBox(NULL, ThreadCreated, AppName, MB_OK);
        break;
    case DLL_PROCESS_DETACH:
        MessageBox(NULL, ThreadDestroyed, AppName, MB_OK);
        break;
    }

    return TRUE;
}

void TestHello(void)
{
    MessageBox(NULL, HelloMsg, AppName, MB_OK);

    return;
}
P.S. Exporting from a DLL Using __declspec(dllexport) --> http://msdn.microsoft.com/en-us/libr...=vs.80%29.aspx

Последний раз редактировалось 8Observer8; 02.06.2012 в 23:08.
8Observer8 вне форума Ответить с цитированием
Старый 03.06.2012, 20:58   #20
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Урок 23. Иконка в system tray --> http://wasm.ru/article.php?article=1001023

main.c
Код:
#include <windows.h>
#include <tchar.h>

LRESULT CALLBACK WindowProc( HWND hwnd,
                             UINT uMsg,
                             WPARAM wParam,
                             LPARAM lParam
                           );

LPCTSTR ClassName = _T("TrayIconWinClass");
LPCTSTR AppName = _T("TrayIcon Demo");

int WINAPI _tWinMain( HINSTANCE hInstance,
                      HINSTANCE hPrevInstance,
                      LPTSTR lpCmdLine,
                      int nCmdShow
                    )
{
    WNDCLASSEX wc;
    MSG msg;
    HWND hwnd;

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
    wc.lpfnWndProc = WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = ClassName;
    wc.hIconSm = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION);

    if (RegisterClassEx(&wc) == 0) {
        MessageBox(NULL, _T("Cannot regiser window class"), _T("Error"), MB_ICONERROR);
        return FALSE;
    }

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_CONTROLPARENT,
                          ClassName,
                          AppName,
                          WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | 
                          WS_MAXIMIZEBOX | WS_VISIBLE,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          350,
                          200,
                          (HWND) NULL,
                          (HMENU) NULL,
                          hInstance,
                          NULL);

    if (hwnd == NULL) {
        MessageBox(NULL, _T("Cannot create window"), _T("Error"), MB_ICONERROR);
        return FALSE;
    }

    ShowWindow(hwnd, SW_SHOWNORMAL);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0) != 0) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

#define WM_SHELLNOTIFY (WM_USER+5)
#define IDI_TRAY 0
#define IDM_RESTORE 1000
#define IDM_EXIT 1010

LPCTSTR RestoreString = _T("&Restore");
LPCTSTR ExitString = _T("E&xit Program");

NOTIFYICONDATA note;
HMENU hPopupMenu;

LRESULT CALLBACK WindowProc( HWND hWnd,
                             UINT uMsg,
                             WPARAM wParam,
                             LPARAM lParam
                           )
{
    POINT pt;

    switch(uMsg) {
    case WM_CREATE:
            hPopupMenu = CreatePopupMenu();
            AppendMenu(hPopupMenu, MF_STRING, IDM_RESTORE, RestoreString);
            AppendMenu(hPopupMenu, MF_STRING, IDM_EXIT, ExitString);
        break;
    case WM_DESTROY:
        DestroyMenu(hPopupMenu);
        PostQuitMessage(0);
        break;
    case WM_SIZE:
        if (wParam == SIZE_MINIMIZED) {
            note.cbSize = sizeof(NOTIFYICONDATA);
            note.hWnd = hWnd;
            note.uID = IDI_TRAY;
            note.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
            note.uCallbackMessage = WM_SHELLNOTIFY;
            note.hIcon = LoadIcon(NULL, IDI_WINLOGO);
            _tcscpy(note.szTip, AppName);
            ShowWindow(hWnd, SW_HIDE);
            Shell_NotifyIcon(NIM_ADD, &note);
        }
        break;
    case WM_COMMAND:
        if (lParam == 0) {
            Shell_NotifyIcon(NIM_DELETE, &note);
            if (LOWORD(wParam) == IDM_RESTORE) {
                ShowWindow(hWnd, SW_RESTORE);
            }
            else {
                DestroyWindow(hWnd);
            }
        }
        break;
    case WM_SHELLNOTIFY:
        if (wParam == IDI_TRAY) {
            if (lParam == WM_RBUTTONDOWN) {
                GetCursorPos(&pt);
                SetForegroundWindow(hWnd);
                TrackPopupMenu(hPopupMenu, TPM_RIGHTALIGN | TPM_RIGHTBUTTON,
                               pt.x, pt.y, 0, hWnd, NULL);
                PostMessage(hWnd, WM_NULL, 0, 0);
            }
            else if (lParam == WM_LBUTTONDBLCLK) {
                SendMessage(hWnd, WM_COMMAND, IDM_RESTORE, 0);
            }
        }
        break;
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

    return 0;
}

Последний раз редактировалось 8Observer8; 03.06.2012 в 21:08.
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Win32 API Tymchuk C++ Builder 0 16.05.2012 21:53
win32 API.Visual Studio 2008.Создание проекта Win32 Aleksandr_Yanov Visual C++ 2 12.09.2010 13:09
Win32 API. VS2008. Как создать приложение win32 в vs2008? Aleksandr_Yanov Visual C++ 4 12.09.2010 00:59
Win32 Api revaldo666 Win Api 10 06.07.2010 00:48
Win32 Api! alexov Общие вопросы C/C++ 7 09.02.2009 22:25