Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Блокировка клавиш


Автор: gta4kv 13.4.2007, 17:49
Всем бодрый вечер.

Вообщем появилось такая нужда, заблокировать комбинации клавиш "Ctrl-Alt-Delete","Alt+F4","Alt-Tab". И прочие комбинации, с помощью которых можно выйти из программы. ( К вирусам это ни как не относится ).

Смысл в том что сам код надо запихнуть в DLL'ку и прикрутить её к Vb.NET проекту, поскольку в VB нету таких возможностей..

Посколько я С++ дуб -  smile  smile 

Заранее благодарен. 

Автор: _hunter 13.4.2007, 18:29
поиск по форуму спасет отца советской демократии... -- таких тем (даже с примерами) кучу уже понаподнимали...

Автор: v2v 13.4.2007, 18:32

Иди в раздел Вин АПИ и там читай темы где встречяются слова: "перехват нажатия клавиш" и "хуки".
На счёт длл - это ты правильно придумал, так нажатия будут не только в твоём приложении, но и все нажатия в винде...


Хотя с другой стороны тебе наверное что то другое надо нежели перехват нажатий клавиш, бо: правое нажатие клавиш на часах (правый нижний угол) и выбираем: Диспечер задач).

Автор: gta4kv 13.4.2007, 18:38
Дык часов то тоже не будет!
Да и подставить "свою" правую кнопку, в VB не проблема. 

ps. Полез в поиск.

Автор: gta4kv 13.4.2007, 18:56
Вы будите меня пинать, но ничего подходящего не нашел. ( Может из-за того что у меня .net язык? )

Можно или указать меня на тему или лучше сюда пример?  smile  smile 

Я вроде уже написал что я С++.дуб))

Автор: Greeen 13.4.2007, 19:17
http://forum.vingrad.ru/topic-58670/hl/%25D0%25BF%25D0%25B5%25D1%2580%25D0%25B5%25D1%2585%25D0%25B2%25D0%25B0%25D1%2582%2Cand%2C%25D0%25BA%25D0%25BB%25D0%25B0%25D0%25B2%25D0%25B8%25D1%2588/index.html
http://forum.vingrad.ru/topic-88943/hl/%25D0%25BF%25D0%25B5%25D1%2580%25D0%25B5%25D1%2585%25D0%25B2%25D0%25B0%25D1%2582%2Cand%2C%25D0%25BA%25D0%25BB%25D0%25B0%25D0%25B2%25D0%25B8%25D1%2588/index.html
http://forum.vingrad.ru/topic-142754/hl/%25D0%25BF%25D0%25B5%25D1%2580%25D0%25B5%25D1%2585%25D0%25B2%25D0%25B0%25D1%2582%2Cand%2C%25D0%25BA%25D0%25BB%25D0%25B0%25D0%25B2%25D0%25B8%25D1%2588/index.html
Еще с десяток можно найти если постараться.

Автор: gta4kv 13.4.2007, 19:44
Воспользовался ссылкой из первого примера ( http://www.uinc.ru/articles/zametki/001.shtml )
Застрял на .cpp файле ( смотрите по той же ссылке ) 

Получил такие ошибки : http://img222.imageshack.us/img222/6818/spfb7.png

Автор: Greeen 13.4.2007, 19:47
Что за среда/компилятор? Винда?

Автор: gta4kv 13.4.2007, 19:48
Винда

Visual Studio 2005.

Автор: Greeen 13.4.2007, 19:50
smile))) понятно что винда. не виста случаем?

Автор: gta4kv 13.4.2007, 19:52
Нет. XP.

Что бы под вистой пахало нужен апдейт 500мб.. Так что Visual Studio у меня под XP.

Автор: Greeen 13.4.2007, 19:57
Странно на самом деле. Эти функции в user32.dll находятся. Покажи код, может чего напутал.

Так так, только заметил, а зачем тебе .NET для хука?

Автор: gta4kv 13.4.2007, 20:00
Цитата(Greeen @ 13.4.2007,  19:57)
Странно на самом деле. Эти функции в user32.dll находятся. Покажи код, может чего напутал.

Так так, только заметил, а зачем тебе .NET для хука?

.NET а с чего ты решил что мне именно NET нужен?


Код :

Код

// This is the main DLL file.

#include "stdafx.h"

#include "Lock.h"

// Глобальные переменные
HINSTANCE hInstance = NULL; // The instance of the DLL

// Описание нашей хук-функци
LRESULT CALLBACK KeyboardMsgProc ( int, WPARAM, LPARAM );


#pragma data_seg(".SData")
HHOOK hMsgHook = NULL; // Handle нашего хука
UINT KBoardMessage = NULL; // Сообщение, которое мы будем посылать
                           // родительскому приложению
HWND hParentWnd = NULL; // Окно родительского приложения
#pragma data_seg( )

//Директива линкеру создать разделяемую(shared) секцию с атрибутами RWS
#pragma comment(linker,"/SECTION:.SData,RWS")

// Далее, обычная DllMain
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    if (ul_reason_for_call == DLL_PROCESS_ATTACH)
        hInstance = (HINSTANCE)hModule;

    return TRUE;
}

// Две функции SetHook и UnsetHook

MYHOOKDLL_API int SetHook (HWND hWnd, // window which 
                    // should receive notification messages
        UINT UpdateMsg) // notification message
{
    if (hWnd == NULL) return -1;
    
    // Save received parameters
    hParentWnd = hWnd;
    KBoardMessage = UpdateMsg;
    
    // Set hook
    hMsgHook= ::SetWindowsHookEx (WH_GETMESSAGE, KeyboardMsgProc, hInstance, 0);
    
    // If we are failed...
    if (hMsgHook == NULL)
        return -1;
        
    return 0;
};

MYHOOKDLL_API int UnSetHook()
{
    UnhookWindowsHookEx (hMsgHook);
    
    hMsgHook = NULL;
    
    return 0;
};


LRESULT CALLBACK KeyboardMsgProc (int code, WPARAM wParam, LPARAM lParam)
{
    if (code >= 0)
    {
        MSG * msg = (MSG * )lParam;


        if ((lParam)
            &&(msg->message == WM_CHAR)
            &&(wParam == PM_REMOVE))

    
            PostMessage (hParentWnd, KBoardMessage, msg->wParam, 0 );
    }


    return CallNextHookEx (hMsgHook, code ,wParam , lParam);
};



Автор: Greeen 13.4.2007, 20:02
Иди в свойства проекта (Project->Properties) и ставь Use Managed Extensions - NO

Автор: gta4kv 13.4.2007, 20:10
В какой это может быть вкладке ? Я что то не нашел.  smile 

Автор: Greeen 13.4.2007, 20:15
Так если для DLL C/C++ -> Compile As Managed -> Not Using Managed Extensions

Автор: gta4kv 13.4.2007, 20:19
Издеваешься? 

C/C++ есть. а вот Compile As Managed и тем более  Not Using Managed Extensions
 - нету! хоть убей

Автор: Greeen 13.4.2007, 20:22
Торможу  smile Project->Properties На первой же вкладочке General есть параметр 3-й снизу Use Managed Extensions. Поставь ему значение No

Автор: gta4kv 13.4.2007, 20:38
Ты точно надомной издеваешься :

smile 

http://img69.imageshack.us/img69/2130/10801079107610771074107jb8.png   

Автор: Greeen 13.4.2007, 20:45
Гы.. да не издеваюсь.. просто вспомнил что дома то у меня VS 2003  smile  smile  smile  сорри.. ну посмотри по вкладочкам, неужто так сложно.. отключи эти управляемые примочки

Автор: gta4kv 13.4.2007, 20:46
Я уже по всем прорыл! Нету. Или может он как нибудь подругому называетцо?

Автор: Greeen 13.4.2007, 20:51
Глаза мне выколоть...  smile Common Language Runtime Support на хрен

Автор: gta4kv 13.4.2007, 20:56
Дык там его незя вырубить.
Тока выбрать другой "вариант".

Добавлено через 53 секунды
Наврал, можно. Ща затестю

Автор: Greeen 13.4.2007, 20:57
Какой вариант?

Автор: gta4kv 13.4.2007, 20:58
Убрал! Получил 23 ошибки в файле : AssemblyInfo.cpp

Автор: Greeen 13.4.2007, 21:00
Что за файл? Какие ошибки?

Автор: gta4kv 13.4.2007, 21:01
АсеблиИнфо это стандартный файл! Очистил его теперь вот так :

Код



Compiling...
AssemblyInfo.cpp
Linking...
   Creating library C:\Documents and Settings\Dan\Мои документы\Visual Studio 2005\Projects\Lock\Release\Lock.lib and object C:\Documents and Settings\Dan\Мои документы\Visual Studio 2005\Projects\Lock\Release\Lock.exp
Lock.obj : error LNK2001: unresolved external symbol __imp__SetWindowsHookExW@16
Lock.obj : error LNK2001: unresolved external symbol __imp__UnhookWindowsHookEx@4
Lock.obj : error LNK2001: unresolved external symbol __imp__PostMessageW@16
Lock.obj : error LNK2001: unresolved external symbol __imp__CallNextHookEx@16
C:\Documents and Settings\Dan\Мои документы\Visual Studio 2005\Projects\Lock\Release\Lock.dll : fatal error LNK1120: 4 unresolved externals


Автор: Greeen 13.4.2007, 21:04
Слушай, кстати у меня компилит и с /clr и без.
Выложи проект полностью.

Автор: gta4kv 13.4.2007, 21:05
Компилит? Сбрось тогда мне компиленую плиз..

PS. Если можешь напиши в асю ( 500-502 )

Добавлено через 3 минуты и 23 секунды
Цитата(Greeen @ 13.4.2007,  21:04)
Выложи проект полностью.

http://dump.ru/files/8/8297113/

Автор: gta4kv 13.4.2007, 21:42
Проблема решена. Всё скомпилилось. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)