Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|
Как аккуратно(!) обнаружить подключение флешки? |

01.12.2008, 23:03
|
|
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме: 2982851
Репутация:
107
|
|
Как аккуратно(!) обнаружить подключение флешки?
Как это сделать аккуратно?То есть что бы и флопик не тарахтел,и процессор излишне на слабых машинах не грузился ,и что бы не возникало никаких подозрительных симтопом при вставке\выбросе оптических дисков.
ЗЫ:ганять в цикле по алфавиту GetDriveType как то не очень хочется.
Последний раз редактировалось _nic; 01.12.2008 в 23:06..
|
|
|

02.12.2008, 03:00
|
|
Постоянный
Регистрация: 30.04.2008
Сообщений: 323
Провел на форуме: 379101
Репутация:
136
|
|
Гоняй в цикле по алфавиту начиная с B по Z и не будет тарахтеть флопик
|
|
|

02.12.2008, 05:33
|
|
Новичок
Регистрация: 27.01.2008
Сообщений: 13
Провел на форуме: 210819
Репутация:
26
|
|
Сообщение от _nic
Как это сделать аккуратно?То есть что бы и флопик не тарахтел,и процессор излишне на слабых машинах не грузился ,и что бы не возникало никаких подозрительных симтопом при вставке\выбросе оптических дисков.
ЗЫ:ганять в цикле по алфавиту GetDriveType как то не очень хочется.
возможно стоит посмотреть в строну WMI и Win32_DeviceChangeEvent(да и других событий), только все это дело под XP и выше.
|
|
|

02.12.2008, 11:34
|
|
Постоянный
Регистрация: 19.10.2007
Сообщений: 794
Провел на форуме: 1013791
Репутация:
711
|
|
Предыдущий автор прав. Копать в сторону событий.
http://msdn.microsoft.com/en-us/library/aa363205(VS.85).aspx
Последний раз редактировалось neprovad; 02.12.2008 в 11:38..
|
|
|

02.12.2008, 17:37
|
|
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме: 2982851
Репутация:
107
|
|
Не совсем понял технологию.Это что надо перхватывать WindowProc и смотреть что там в uMsg ?
|
|
|

02.12.2008, 18:03
|
|
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
Провел на форуме: 4226446
Репутация:
1564
|
|
>> Это что надо перхватывать WindowProc и смотреть что там в uMsg ?
нет. вы регистрируете свой обработчик. и система его вызовет, котгда устройство будет присоединено
http://msdn.microsoft.com/en-us/library/aa363432(VS.85).aspx
Последний раз редактировалось 0x0c0de; 02.12.2008 в 18:06..
|
|
|

02.12.2008, 23:02
|
|
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме: 2982851
Репутация:
107
|
|
ВОт нагуглил более простой пример чем на МСДН
Код:
#include <windows.h>
#include <iostream>
#include <dbt.h>
class CatchAll
{
public:
LRESULT DeviceChange(DWORD event, PDEV_BROADCAST_HDR pHdr);
HWND m_hwnd;
};
LRESULT CatchAll::DeviceChange(DWORD event, PDEV_BROADCAST_HDR pHdr)
{
BOOL fEvent = FALSE ;
switch (event)
{
case DBT_DEVICEARRIVAL:
printf("Begin");
fEvent = TRUE ;
break ;
case DBT_DEVICEREMOVECOMPLETE:
printf( "End");
fEvent = TRUE ;
}
if (fEvent)
{
switch( pHdr->dbch_devicetype )
{
case DBT_DEVTYP_VOLUME:
PDEV_BROADCAST_VOLUME pDevVolume = (PDEV_BROADCAST_VOLUME)pHdr;
// do something...
printf ("WM_DEVICECHANGE hurra!!!");
break;
}
}
return 0;
}
LRESULT CALLBACK MessageLoopProc(HWND m_hwnd,UINT Message,WPARAM wParam,LPARAM lParam)
{
CatchAll ca;
switch ( Message )
{
case WM_DEVICECHANGE:
MessageBox(m_hwnd,TEXT("Device changed"),TEXT("Sys message"),MB_OK);
printf ("WM_DEVICECHANGE in MessageLoopProc!");
ca.DeviceChange( wParam, (PDEV_BROADCAST_HDR)lParam);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(m_hwnd,Message,wParam,lParam);
}
return 0;
}
int main()
{
HINSTANCE hInst = GetModuleHandle(NULL);
WNDCLASSEX WndClass;
HWND m_hwnd;
char szClassName[] = "HiddenWindow";
WndClass.cbSize = sizeof(WNDCLASSEX);
WndClass.style=CS_HREDRAW | CS_VREDRAW;
WndClass.lpfnWndProc = /*(WNDPROC)*/MessageLoopProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = hInst;
WndClass.hIcon = 0l;
WndClass.hCursor = NULL;
WndClass.hbrBackground = NULL;
WndClass.lpszMenuName = NULL;
WndClass.lpszClassName = szClassName;
WndClass.hIconSm = 0l;
RegisterClassEx(&WndClass);
m_hwnd = CreateWindow( szClassName, "Hidden Window",
WS_OVERLAPPEDWINDOW,
0,
0,
10,
10,
NULL,
NULL,
hInst,
NULL);
ShowWindow(m_hwnd,SW_SHOW); // SW_HIDE
UpdateWindow(m_hwnd);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
/* return CatchAll().MessageLoop();*/
return 0;
}
только вот меня смущяет то что код хоть и выглядит гуевым но точка входа main  Да и ещё непонятно почему мессагбокс вылазит раз 5 при вставке флешки.WM_DEVICECHANGE это что получается при вставке флэхи это событие происходит 5 раз подряд??
Последний раз редактировалось _nic; 02.12.2008 в 23:05..
|
|
|

02.12.2008, 23:43
|
|
Новичок
Регистрация: 27.01.2008
Сообщений: 13
Провел на форуме: 210819
Репутация:
26
|
|
Сообщение от _nic
ВОт нагуглил более простой пример чем на МСДН
Код:
#include <windows.h>
#include <iostream>
#include <dbt.h>
class CatchAll
{
public:
LRESULT DeviceChange(DWORD event, PDEV_BROADCAST_HDR pHdr);
HWND m_hwnd;
};
LRESULT CatchAll::DeviceChange(DWORD event, PDEV_BROADCAST_HDR pHdr)
{
BOOL fEvent = FALSE ;
switch (event)
{
case DBT_DEVICEARRIVAL:
printf("Begin");
fEvent = TRUE ;
break ;
case DBT_DEVICEREMOVECOMPLETE:
printf( "End");
fEvent = TRUE ;
}
if (fEvent)
{
switch( pHdr->dbch_devicetype )
{
case DBT_DEVTYP_VOLUME:
PDEV_BROADCAST_VOLUME pDevVolume = (PDEV_BROADCAST_VOLUME)pHdr;
// do something...
printf ("WM_DEVICECHANGE hurra!!!");
break;
}
}
return 0;
}
LRESULT CALLBACK MessageLoopProc(HWND m_hwnd,UINT Message,WPARAM wParam,LPARAM lParam)
{
CatchAll ca;
switch ( Message )
{
case WM_DEVICECHANGE:
MessageBox(m_hwnd,TEXT("Device changed"),TEXT("Sys message"),MB_OK);
printf ("WM_DEVICECHANGE in MessageLoopProc!");
ca.DeviceChange( wParam, (PDEV_BROADCAST_HDR)lParam);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(m_hwnd,Message,wParam,lParam);
}
return 0;
}
int main()
{
HINSTANCE hInst = GetModuleHandle(NULL);
WNDCLASSEX WndClass;
HWND m_hwnd;
char szClassName[] = "HiddenWindow";
WndClass.cbSize = sizeof(WNDCLASSEX);
WndClass.style=CS_HREDRAW | CS_VREDRAW;
WndClass.lpfnWndProc = /*(WNDPROC)*/MessageLoopProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = hInst;
WndClass.hIcon = 0l;
WndClass.hCursor = NULL;
WndClass.hbrBackground = NULL;
WndClass.lpszMenuName = NULL;
WndClass.lpszClassName = szClassName;
WndClass.hIconSm = 0l;
RegisterClassEx(&WndClass);
m_hwnd = CreateWindow( szClassName, "Hidden Window",
WS_OVERLAPPEDWINDOW,
0,
0,
10,
10,
NULL,
NULL,
hInst,
NULL);
ShowWindow(m_hwnd,SW_SHOW); // SW_HIDE
UpdateWindow(m_hwnd);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
/* return CatchAll().MessageLoop();*/
return 0;
}
только вот меня смущяет то что код хоть и выглядит гуевым но точка входа main  Да и ещё непонятно почему мессагбокс вылазит раз 5 при вставке флешки.WM_DEVICECHANGE это что получается при вставке флэхи это событие происходит 5 раз подряд??
да хоть nepohek назови главное указать это в параметрах линкера,флаг SUBSYSTEM отвечает за тип приложения (например /SUBSYSTEM:CONSOLE) и флаг ENTRY за точку входа(/ENTRY:"nepohek"). в студии это можно сделать через опции проекта( Linker->System->SubSystem b Linker->Advanced->Entry Point)
|
|
|

03.12.2008, 06:08
|
|
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
Провел на форуме: 4226446
Репутация:
1564
|
|
да хоть nepohek назови главное указать это в параметрах линкера,флаг SUBSYSTEM отвечает за тип приложения (например /SUBSYSTEM:CONSOLE) и флаг ENTRY за точку входа(/ENTRY:"nepohek"). в студии это можно сделать через опции проекта( Linker->System->SubSystem b Linker->Advanced->Entry Point)
Или в самом коде...
#pragma comment(linker,"/ENTRY:main")
и
#pragma comment(linker,"/SUBSYSTEM:CONSOLE")
|
|
|

03.12.2008, 20:27
|
|
Постоянный
Регистрация: 19.10.2007
Сообщений: 794
Провел на форуме: 1013791
Репутация:
711
|
|
все верно что 5 раз, просто из всего этого изобилия надо выбрать все что попадает под event = DBT_DEVICEARRIVAL
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|