Borland C++ FAQ
Страница 9. Разное


   

Разное

  1. Регистрация редактора свойства типа AnsiString

    // Регистрация редактора свойства типа AnsiString производится следующим образом. Напишите вспомогательную функцию:
    TTypeInfo *AnsiStringTypeInfo(void)
    {
    TTypeInfo *typeinfo = new TTypeInfo;
    typeinfo->Kind = tkLString;
    typeinfo->Name = "AnsiString";
    return typeinfo;
    }
    // ... и используйте ее в вызове RegisterPropertyEditor
    // (где TMyComponent - имя класса компонента,
    // MyStringProperty - имя свойства типа AnsiString,
    // TMyStringPropertyEditor - имя класса редактора свойства
    // типа AnsiString).
    RegisterPropertyEditor(AnsiStringTypeInfo(),
    __classid(TMyComponent), "MyStringProperty",
    __classid(TMyStringPropertyEditor));

  2. Мигание иконкой в панели задач

    // Чтобы помигать иконкой приложения в панели задач, разместите на форме компонент TTimer (Timer1) и напишите следующий обработчик события OnTimer (предварительно выставив интервал таймера и сделав его активным):
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    FlashWindow(Application->Handle, false);
    FlashWindow(Application->Handle, true);
    }

  3. Запуск скринсейвера из программы

    // Следующий код запустит скринсейвер Handle - дескриптор окна вашей программы (программисты на C++Builder могут использовать Application->Handle):
    SendMessage(Handle, WM_SYSCOMMAND, SC_SCREENSAVE, 0);

  4. Скрытие таскбара

    // Напишите следующий код:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    HWND H;
    H=FindWindow("Shell_TrayWnd",NULL); //находим хандл окна таскбара
    ShowWindow(H, SW_HIDE);//делаем его невидимым
    Sleep(2000);
    ShowWindow(H, SW_SHOW);//делаем его видимым
    }

  5. Переключение раскладки клавиатуры (конкретный язык)

    // Напишите следующий код:
    LoadKeyboardLayout("00000409", KLF_ACTIVATE);// Английская
    LoadKeyboardLayout("00000419", KLF_ACTIVATE);// Русская

  6. Переключение раскладки клавиатуры

    // Напишите следующий код:
    ActivateKeyboardLayout(0, 0);

  7. Программная очистка корзины (для Windows 98)

    // Напишите следующий код:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    /* Очистка корзины
    Есть флаги - NULL - как обычно, т.е. по умолчанию
    SHERB_NOCONFIRMATION 0x00000001 - без запроса на удаление
    SHERB_NOPROGRESSUI 0x00000002 - без показа удаления
    SHERB_NOSOUND 0x00000004 - без звука
    при желании флаги можно сочетать через | */

    char sh[500];
    SHEmptyRecycleBin(Handle, sh, SHERB_NOSOUND|SHERB_NOCONFIRMATION);
    }

  8. Запуск браузера

    // Напишите следующий код:
    void __fastcall TForm1::Label1Click(TObject *Sender)
    {
    ShellExecute(Handle, "open", "https://google.com/",
    0, 0, SW_SHOWNORMAL);
    }

  9. Запуск почтового клиента

    // Напишите следующий код:
    void __fastcall TForm1::Label1Click(TObject *Sender)
    {
    ShellExecute(Handle,NULL,"mailto: Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script ?subject=Tema",
    NULL,NULL,SW_SHOWNORMAL);
    }

  10. Как добавить код на ассемблере

    // Ассемблеровские вставки делаются так:
    asm {
    // код ассемблера
    }

  11. Как сделать Shutdown (закрыть все запущенные приложения)

    // напишите следующий код:
     HANDLE hToken; TOKEN_PRIVILEGES tkp; // Get a token for this process. 
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
    &hToken)) ShowMessage("OpenProcessToken"); // Get the LUID for the shutdown privilege.
    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
    &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; // one privilege to set
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // Get the shutdown privilege for this process.
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
    (PTOKEN_PRIVILEGES)NULL, 0); // Cannot test the return value of AdjustTokenPrivileges.
    if (GetLastError() != ERROR_SUCCESS)
    ShowMessage("AdjustTokenPrivileges"); // Shut down the system and force all applications to close.
    if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE , 0)) ShowMessage("ExitWindowsEx");

  12. Какая на программа активна

    // Для того что бы узнать какая программа активна кинте на форму таймер Timer1 и метку Label1 напишите следующий код:
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    HANDLE hWnd;
    hWnd = GetForegroundWindow();
    char szTitle[41] = {0};
    GetWindowText(hWnd,szTitle,40);
    Label1->Caption = AnsiString(szTitle);
    }

  13. Блокировка клавиатуры и мыши

    // Для блокировки клавиатуры и мыши напишите следующий код:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    HINSTANCE hDll;
    //ниже прототип будущей функции
    DWORD __stdcall (*BlockInput)(bool Status);
    DWORD Result;
    Memo1->Lines->Add("");
    Memo1->Lines->Add("Загрузка функции BlockInput()...");
    hDll = LoadLibrary("User32.dll");
    Memo1->Lines->Add("hDll = " + IntToHex(int(hDll), 8));
    BlockInput = (DWORD __stdcall (*)(bool Status))GetProcAddress(hDll,
    "BlockInput");
    Memo1->Lines->Add("BlockInput = " + IntToHex(int(BlockInput), 8));
    if(!BlockInput)
    {
    Memo1->Lines->Add("Ошибка!!!");
    FreeLibrary(hDll);
    return;
    }
    Memo1->Lines->Add("Выполняем BlockInput(true)...");
    Result = BlockInput(true);
    Memo1->Lines->Add("Result = " + IntToStr(Result));
    if(Result)
    {
    Memo1->Lines->Add("Теперь клиатура и мышь доступны только, если нажать CTRL+ALT+DEL");
    Memo1->Lines->Add("Ждем 15 сек...");
    Sleep(15000);
    }
    else Memo1->Lines->Add("Ошибка!!!");
    Memo1->Lines->Add("Восстанавливаем все как было...");
    BlockInput(false);
    FreeLibrary(hDll);
    Memo1->Lines->Add("Готово.");
    }

  14. Как из тела программы запустить обработчик события (как функцию)

    // напишите следующий код в нужном месте:
    {
    ...
    Form1->Button1Click(Form1);
    ...
    }

  15. Определение количества элементов в массиве

    Чтобы в Run Time определить количество элементов в массиве, можно воспользоваться макросом ARRAYSIZE, определённым в файле sysopen.h следующим образом:
    #define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))


  16. Имитации нажатия левой кнопки мыши

    // Напищите слеующий код в нужном месте:
    INPUT inp[2];
    memset(inp,0,sizeof(inp));
    inp[0].type=INPUT_MOUSE;
    inp[0].mi.dwFlags=MOUSEEVENTF_LEFTDOWN;
    inp[1].type=INPUT_MOUSE;
    inp[1].mi.dwFlags=MOUSEEVENTF_LEFTUP;
    SendInput(2,inp,sizeof(INPUT));

   

 
« Предыдущая статья