eManual.ru - электронная документация
Секция 3 из 3 - Предыдущая - Следующая
Все секции
- 1
- 2
- 3
A>
Вариант1:
From : Sergey Gazimagomedov 2:453/11.13
Мне нужен был МАС адpес, так я его получал, пользуясь NetBIOS.
Добавляешь имя NetBIOS и посылаешь на имя станции, нужной для опpеделения(можно
и своей) датагpамный пакет с заполненным NCB.
Вот исходник моей функции для опpеделения МАС адpеса.
UCHAR MYLIBAPI GetAdapterID(char *Name, // NetBIOS имя станции
UINT lana_num,
CARDID *ID) // 6 байтовый массив
{
UCHAR rc = 0;
UCHAR Status[256];
while( lstrlen(Name) - 15)
lstrcat(Name, " ");
memset(&SNcb, 0, sizeof(NCB));
SNcb.ncb_command = NCBASTAT;
SNcb.ncb_buffer = (LPSTR)Status;
SNcb.ncb_length = 256;
lstrcpy(SNcb.ncb_callname, Name);
SNcb.ncb_lana_num = lana_num;
rc = Netbios( &SNcb );
if(rc ==0){
memcpy(ID, Status, 6);
}
return(SNcb.ncb_cmd_cplt);
}
Это под Win32. Конечно должен быть пpотокол NetBIOS, но он в фоpточках и так
необходим.
Вариант2:
From : Alexey Grachyov <rook@relex.ru>
#include <windows.h>
#include <winsock.h>
#include <wsipx.h>
#include <wsnwlink.h>
#include <stdio.h>
void main()
{
int iAdapters,iOpt=sizeof(iAdapters),iSize=sizeof(SOCKADDR_IPX);
SOCKET skNum;
SOCKADDR_IPX Addr;
WSADATA Wsa;
if(WSAStartup(0x0101,&Wsa)) return;
if((skNum=socket(AF_IPX,SOCK_DGRAM,NSPROTO_IPX))!=INVALID_SOCKET)
{
memset(&Addr,0,sizeof(Addr));
Addr.sa_family=AF_IPX;
if(bind(skNum,(SOCKADDR *)&Addr,iSize)!=SOCKET_ERROR)
{
if(getsockopt(skNum,NSPROTO_IPX,IPX_MAX_ADAPTER_NUM,
(char *)&iAdapters,&iOpt)!=SOCKET_ERROR)
{
while(iAdapters)
{
IPX_ADDRESS_DATA Data;
memset(&Data,0,sizeof(Data));
Data.adapternum=iAdapters-1;
iOpt=sizeof(Data);
if(getsockopt(skNum,NSPROTO_IPX,IPX_ADDRESS,(char
*)&Data,&iOpt)!=SOCKET_ERROR)
{
printf("Addr: %02X%02X%02X%02X:%02X%02X%02X%02X%02X%02Xn",
(int)Data.netnum[0],(int)Data.netnum[1],(int)Data.netnum[2],
(int)Data.netnum[3],(int)Data.netnum[4],(int)Data.netnum[5],
(int)Data.netnum[6],(int)Data.netnum[7],(int)Data.netnum[8],
(int)Data.netnum[9]);
}
iAdapters--;
}
}
}
closesocket(skNum);
}
WSACleanup();
}
Вариант3:
From: MSDN
#include <windows.h>
#include <wincon.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}ASTAT, * PASTAT;
ASTAT Adapter;
void main (void)
{
NCB Ncb;
UCHAR uRetCode;
char NetName[50];
memset( &Ncb, 0, sizeof(Ncb) );
Ncb.ncb_command = NCBRESET;
Ncb.ncb_lana_num = 0;
uRetCode = Netbios( &Ncb );
printf( "The NCBRESET return code is: 0x%x n", uRetCode );
memset( &Ncb, 0, sizeof (Ncb) );
Ncb.ncb_command = NCBASTAT;
Ncb.ncb_lana_num = 0;
strcpy( Ncb.ncb_callname, "* " );
Ncb.ncb_buffer = (char *) &Adapter;
Ncb.ncb_length = sizeof(Adapter);
uRetCode = Netbios( &Ncb );
printf( "The NCBASTAT return code is: 0x%x n", uRetCode );
if ( uRetCode == 0 )
{
printf( "The Ethernet Number is: %02x%02x%02x%02x%02x%02xn",
Adapter.adapt.adapter_address[0],
Adapter.adapt.adapter_address[1],
Adapter.adapt.adapter_address[2],
Adapter.adapt.adapter_address[3],
Adapter.adapt.adapter_address[4],
Adapter.adapt.adapter_address[5] );
}
}
43)----------------------------------------------------------------------------
Q> Как сделать, чтобы мою прогу нельзя было бы убить?
A> Я не пробовал,но imho от End Task это не спасет
From : Dmitry V. Liseev
Делать неубиваемый процесс очень просто.
Перед тем, как убить винда сначала попытается завершить
его по-хорошему. Тут он и должен запустить свою копию
и передать ей все нужные данные перед благополучным
завершением.
LRESULT WINAPI WndProc(HWND hWnd, UINT msg,
WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
//HANDLE_MSG(hWnd, WM_CREATE, WndProc_OnCreate);
HANDLE_MSG(hWnd, WM_DESTROY, WndProc_OnDestroy);
//HANDLE_MSG(hWnd, WM_SIZE, WndProc_OnSize);
//HANDLE_MSG(hWnd, WM_COMMAND, WndProc_OnCommand);
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
}
void WndProc_OnDestroy(HWND hWnd)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
// Создадим другой процесс, а этот благополучно завершим.
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
CreateProcess(NULL, "program.exe", NULL, NULL,
FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
PostQuitMessage(0);
//return FORWARD_WM_DESTROY(hWnd, DefWindowProc);
}
44)----------------------------------------------------------------------------
Q> Как узнать хэндл консольного окна?
A>
From: PSS ID Number: Q124103
HWND GetConsoleHwnd(void)
{
#define MY_BUFSIZE 1024
HWND hwndFound;
char pszNewWindowTitle[MY_BUFSIZE];
char pszOldWindowTitle[MY_BUFSIZE];
//Запоминаем заголовок консоли
GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
//Делаем уникальную строку из всякой лабуды
wsprintf(pszNewWindowTitle,"%d/%d",
GetTickCount(),
GetCurrentProcessId());
//Меняем заголовок на уникальный
SetConsoleTitle(pszNewWindowTitle);
//Немного подождем
Sleep(40);
//Находим хэндл
hwndFound=FindWindow(NULL, pszNewWindowTitle);
//Меняем загловок окна обратно
SetConsoleTitle(pszOldWindowTitle);
return(hwndFound);
}
45)--------------------------------------------------------------------------
Q> Как активизировать любое окно(передать ему фокус ввода)?
A> Есть недокументированная функция в user32.dll
SwitchToThisWindow( HANDLE hWnd , BOOL Restore );
hWnd - хэндл окна
Restore - развернуть окно,если оно минимизировано.
46)--------------------------------------------------------------------------
Q> Как стереть самого себя?
A> Эта программа уничтожает саму себя.
#include <windows.h>
#include <stdio.h>
void DelSelf(void)
{
char modulename[MAX_PATH];
char batfile[MAX_PATH];
char batlines[MAX_PATH*4];
LPSTR tempdir;
char Buf[MAX_PATH];
GetModuleFileName(NULL,modulename,MAX_PATH);
tempdir = ((GetEnvironmentVariable(TEXT("TEMP"),
Buf, MAX_PATH) > 0) ? Buf : NULL);
strcpy(batfile,tempdir);
strcat(batfile,"\");
strcat(batfile,"delself.bat");
strcpy(batlines,"@echo offn:tryndel ");
strcat(batlines,modulename);
strcat(batlines,"nif exist ");
strcat(batlines,modulename);
strcat(batlines," goto tryn");
strcat(batlines,"del ");
strcat(batlines,batfile);
DWORD NOfBytes;
HANDLE hbf= CreateFile(batfile, GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hbf,batlines,strlen(batlines),&NOfBytes, NULL);
CloseHandle(hbf);
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW;
CreateProcess(
NULL,
batfile,
NULL,
NULL,
FALSE,
IDLE_PRIORITY_CLASS|DETACHED_PROCESS,
NULL,
NULL,
&si,
&pi);
}
void main()
{
DelSelf();
}
47)---------------------------------------------------------------------------
Q> Как поменять default принтер?
A>
int CALLBACK WinMain( HINSTANCE hInst, HINSTANCE hPrevInst,
LPSTR lpCmdLine, int nShowCmd )
{
/* Get the port & device settings for the specified printer */
char szDeviceString[260];
/* First (and only) parameter is the printer name */
lstrcpy( szDeviceString, __argv[1] );
const int Pos = lstrlen( szDeviceString );
/* Append a ',' */
szDeviceString[ Pos ] = ',';
GetProfileString( "Devices", __argv[1], "",
&szDeviceString[Pos+1],
sizeof( szDeviceString ) - (Pos+1) );
/* Have we got the printer? */
if ( szDeviceString[Pos+1] != ' ' )
{
/* Set the default printer */
WriteProfileString( "windows", "device", szDeviceString );
SendMessageTimeout( HWND_BROADCAST, WM_SETTINGCHANGE, 0L,
(LPARAM)(LPCTSTR)"windows", SMTO_NORMAL,
1000, NULL );
}
else
{
MessageBox( NULL, "Printer not found",
"Set Default Printer Utility",
MB_OK | MB_ICONERROR );
}
return 0;
}
References and samples:
Knowledge Base Article Q135387: "How to Get and Set the Default Printer in
Windows"
Knowledge Base Article Q140560 "How to Set the Default Printer Programmatically
in Windows 95"
48)----------------------------------------------------------------------------
Q> Как проверить, есть ли дискета в дисководе?
A>
BOOL IsDiskInDrive ( LPTSTR lpszDrive )
{
UINT errmode;
TCHAR szVolName[256];
DWORD dwMaxComSize;
DWORD dwFlags;
TCHAR szFS[256];
BOOL bRes;
errmode = SetErrorMode ( SEM_FAILCRITICALERRORS );
//если не сделать SetErrorMode - выскочит стандартное окошко "Drive Not Ready"
bRes = GetVolumeInformation ( lpszDrive,
szVolName,
sizeof(szVolName),
NULL, &dwMaxComSize,
&dwFlags,
szFS, sizeof(szFS) );
SetErrorMode ( errmode );
return bRes;
}
Эта технология также работает с CDROM и другими сменными устройствами.
49)----------------------------------------------------------------------------
Q> Как послать пинг?
A> Есть в кишках Windows icmp.dll. Юзать надо именно её.
//
// PingI.c -- Simple ping program using the proprietary
// Microsoft ICMP API
// Автор неизвестен
#include <windows.h>
#include <winsock.h>
#include <stdio.h>
#include <string.h>
typedef struct tagIPINFO
{
u_char Ttl; // Time To Live
u_char Tos; // Type Of Service
u_char IPFlags; // IP flags
u_char OptSize; // Size of options data
u_char FAR *Options; // Options data buffer
}IPINFO, *PIPINFO;
typedef struct tagICMPECHO
{
u_long Source; // Source address
u_long Status; // IP status
u_long RTTime; // Round trip time in milliseconds
u_short DataSize; // Reply data size
u_short Reserved; // Unknown
void FAR *pData; // Reply data buffer
IPINFO ipInfo; // Reply options
}ICMPECHO, *PICMPECHO;
// ICMP.DLL Export Function Pointers
HANDLE (WINAPI *pIcmpCreateFile)(VOID);
BOOL (WINAPI *pIcmpCloseHandle)(HANDLE);
DWORD (WINAPI *pIcmpSendEcho)
(HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD);
//
//
void main(int argc, char **argv)
{
WSADATA wsaData; // WSADATA
ICMPECHO icmpEcho; // ICMP Echo reply buffer
HANDLE hndlIcmp; // LoadLibrary() handle to ICMP.DLL
HANDLE hndlFile; // Handle for IcmpCreateFile()
LPHOSTENT pHost; // Pointer to host entry structure
struct in_addr iaDest; // Internet address structure
DWORD *dwAddress; // IP Address
IPINFO ipInfo; // IP Options structure
int nRet; // General use return code
DWORD dwRet; // DWORD return code
int x;
// Check arguments
if (argc != 2)
{
fprintf(stderr,"nSyntax: pingi HostNameOrIPAddressn");
return;
}
// Dynamically load the ICMP.DLL
hndlIcmp = LoadLibrary("ICMP.DLL");
if (hndlIcmp == NULL)
{
fprintf(stderr,"nCould not load ICMP.DLLn");
return;
}
// Retrieve ICMP function pointers
pIcmpCreateFile = (HANDLE (WINAPI *)(void))
GetProcAddress(hndlIcmp,"IcmpCreateFile");
pIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE))
GetProcAddress(hndlIcmp,"IcmpCloseHandle");
pIcmpSendEcho = (DWORD (WINAPI *)
(HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD))
GetProcAddress(hndlIcmp,"IcmpSendEcho");
// Check all the function pointers
if (pIcmpCreateFile == NULL ||
pIcmpCloseHandle == NULL ||
pIcmpSendEcho == NULL)
{
fprintf(stderr,"nError getting ICMP proc addressn");
FreeLibrary(hndlIcmp);
return;
}
// Init WinSock
nRet = WSAStartup(0x0101, &wsaData );
if (nRet)
{
fprintf(stderr,"nWSAStartup() error: %dn", nRet);
WSACleanup();
FreeLibrary(hndlIcmp);
return;
}
// Check WinSock version
if (0x0101 != wsaData.wVersion)
{
fprintf(stderr,"nWinSock version 1.1 not supportedn");
WSACleanup();
FreeLibrary(hndlIcmp);
return;
}
// Lookup destination
// Use inet_addr() to determine if we're dealing with a name
// or an address
iaDest.s_addr = inet_addr(argv[1]);
if (iaDest.s_addr == INADDR_NONE)
pHost = gethostbyname(argv[1]);
else
pHost = gethostbyaddr((const char *)&iaDest,
sizeof(struct in_addr), AF_INET);
if (pHost == NULL)
{
fprintf(stderr, "n%s not foundn", argv[1]);
WSACleanup();
FreeLibrary(hndlIcmp);
return;
}
// Tell the user what we're doing
printf("nPinging %s [%s]", pHost->h_name,
inet_ntoa((*(LPIN_ADDR)pHost->h_addr_list[0])));
// Copy the IP address
dwAddress = (DWORD *)(*pHost->h_addr_list);
// Get an ICMP echo request handle
hndlFile = pIcmpCreateFile();
for (x = 0; x < 4; x++)
{
// Set some reasonable default values
ipInfo.Ttl = 255;
ipInfo.Tos = 0;
ipInfo.IPFlags = 0;
ipInfo.OptSize = 0;
ipInfo.Options = NULL;
//icmpEcho.ipInfo.Ttl = 256;
// Reqest an ICMP echo
dwRet = pIcmpSendEcho(
hndlFile, // Handle from IcmpCreateFile()
*dwAddress, // Destination IP address
NULL, // Pointer to buffer to send
0, // Size of buffer in bytes
&ipInfo, // Request options
&icmpEcho, // Reply buffer
sizeof(struct tagICMPECHO),
5000); // Time to wait in milliseconds
// Print the results
iaDest.s_addr = icmpEcho.Source;
printf("nReply from %s Time=%ldms TTL=%d",
inet_ntoa(iaDest),
icmpEcho.RTTime,
icmpEcho.ipInfo.Ttl);
if (icmpEcho.Status)
{
printf("nError: icmpEcho.Status=%ld",
icmpEcho.Status);
break;
}
}
printf("n");
// Close the echo request file handle
pIcmpCloseHandle(hndlFile);
FreeLibrary(hndlIcmp);
WSACleanup();
}
50)--------------------------------------------------------------------------
Q> Как программно поменять IP адрес?
1. Открываем HKEY_LOCAL_MACHINE
2. Ищем subKey = SOFTWAREMicrosoftWindows NTCurrentVersionNetworkCards
"netcard# "
"netcard# " номер сетевой карты (обычно 1)
3. Берем значение "ServiceName"
4. Ищем subKey = SYSTEMCurrentControlSetServices"ServiceName"
ParametersTcpIp"
5. Устанавливаем "IpAddress" для смены IP адреса
6. Устанавливаем "SubnetMask" для смены subnet mask
7. Устанавливаем "DefaultGateway" для смены default gateway
8. Перегружаемся.
Q> Как программно поменять HostName?
1. Открываем HKEY_LOCAL_MACHINE
2. Ищем subKey = SYSTEMCurrentControlSetServicesTcpIpParameters
3. Устанавливаем значение "HostName"
4. Ищем subKey = SYSTEMCurrentControlSetControlComputerNameComputerName
5. Устанавливаем значение "ComputerName"
6. Перегружаемся.
Внимание: Неправильное исправление этих значений регистри может вызвать
большие проблемы. Использовать на свой страх и риск.
51)----------------------------------------------------------------------------
Q> Как программно нажать кнопку "Start" ?
#include <windows.h>
void main(void)
{
HWND hTaskBar, hButton;
HDC hDCScreen = GetDC(NULL);
DWORD ScreenHeight=GetDeviceCaps(hDCScreen,VERTRES);
ReleaseDC(NULL, hDCScreen);
hTaskBar= FindWindow("Shell_TrayWnd",NULL);
hButton= GetWindow(hTaskBar, GW_CHILD);
// Нажать кнопку "Пуск"
SendMessage(hButton, WM_LBUTTONDOWN,MK_LBUTTON,LOWORD(5)+
HIWORD(ScreenHeight-20));
// Дальше только ради прикола...
// Спрячем кнопку "Пуск"
ShowWindow(hButton, SW_HIDE);
// Насладимся эрелищем 2 секунды
Sleep(2000);
// Покажем кнопку "Пуск"
ShowWindow(hButton, SW_NORMAL);
}
52)---------------------------------------------------------------------------
Q> Как убрать таскбар?
HWND H;
H=FindWindow("Shell_TrayWnd",NULL); //находим хандл окна таскбара
ShowWindow(H, SW_HIDE);//делаем его невидимым
Sleep(2000);
ShowWindow(H, SW_SHOW);//делаем его видимым
}
53)----------------------------------------------------------------------------
Q> Как в GUI приложении открыть консоль и назначить stdin,stdout,stderr?
#include <windows.h>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
BOOL CreateConsole(void)
{
FreeConsole(); //на всякий случай
if ( AllocConsole() )
{
int hCrt = _open_osfhandle((long)
GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
*stdout = *(::_fdopen(hCrt, "w"));
::setvbuf(stdout, NULL, _IONBF, 0);
*stderr = *(::_fdopen(hCrt, "w"));
::setvbuf(stderr, NULL, _IONBF, 0);
return TRUE;
}return FALSE;
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
CreateConsole();
printf("WinMain with Console testn");
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return TRUE;
}
54)----------------------------------------------------------------------------
Q> Как,зная имя и пароль пользователя и не имея привилегий для LogonUser(),
программно проверить их на правильность?
A> Наиболее просто это воспользоваться NetUserChangePassword()
#include <afxwin.h>
#include <lm.h>
//#include <stdio.h>
#include <conio.h>
#pragma comment(lib,"netapi32")
//------------------------------------------------
void main(void)
{
char UserName[MAX_PATH];
char Password[MAX_PATH];
char CompName[MAX_PATH];
char tmp[MAX_PATH];
strcpy(tmp,"\\");
printf("Computer:");
scanf("%s",CompName);
if(CompName[0]!='\')
{
strcat(tmp,CompName);
strcpy(CompName,tmp);
}
printf("User Name:");
scanf("%s",UserName );
printf("Password:");
char ch;
UINT u=0;
do
{
ch = _getch();
if(ch=='b')
{
_putch('b');
u--;
}
else
{
if(ch!='r')_putch( '*' );
Password[u]=ch;
u++;
}
} while( ch != 'r' );
printf("n");
Password[--u]=0;u=0;
wchar_t wcompname[MAX_PATH];
wchar_t wusername[MAX_PATH];
wchar_t wpassword[MAX_PATH];
mbstowcs( wcompname, CompName, strlen(CompName)+1 );
mbstowcs( wusername, UserName, strlen(UserName)+1 );
mbstowcs( wpassword, Password, strlen(Password)+1 );
switch(NetUserChangePassword(wcompname,wusername,wpassword,wpassword))
{
case ERROR_ACCESS_DENIED:
printf("The user does not have access to the requested information.n");
break;
case NERR_InvalidComputer:
printf("The computer name is invalid.n");
break;
case NERR_NotPrimary:
printf("The operation is allowed only on the primary domain controller of the domain.n");
break;
case NERR_UserNotFound:
printf("The user name could not be found.n");
break;
case NERR_PasswordTooShort:
printf("The password is shorter than required.n");
break;
case 0:
printf("User Okn");
break;
default:printf ("Errorn");;
}
}
55)--------------------------------------------------------------------------
Q> Как динамически прятать/показывать кнопку на таскбаре?
A>
Последовательность действий :
a) Создаем дополнительное невидимое ws_popup окно .
m_hWnd=CreateWindowEx (NULL,TEXT("static"), TEXT(""),
WS_POPUP,
0,0,1600,1200,NULL,(HMENU)NULL,
NULL, NULL);
b) Нужное нам окно делаем childом на этом окне .
hMain=CreateWindowEx (NULL,TEXT("static"), TEXT("Main window"),
WS_POPUP | WS_VISIBLE,
40,50,200,300,m_hWnd,(HMENU)NULL,
NULL, NULL);
c) Теперь спрятать кнопку -
{
ShowWindow(hMain,SW_HIDE);
SetWindowLong(hMain,GWL_EXSTYLE,WS_EX_APPWINDOW);
ShowWindow(hMain,SW_SHOW);
}
d) Показать -
{
ShowWindow(hMain,SW_HIDE);
SetWindowLong(hMain,GWL_EXSTYLE,NULL);
ShowWindow(hMain,SW_SHOW);
}
56)--------------------------------------------------------------------------
Q> Как обрабатывать сообщения от колеса MS Intellimouse?
A>
Для BCB: (не работает в Win95)
в файле unit1.h:
#ifndef WM_MOUSEWHEEL
#define WM_MOUSEWHEEL 0x020A
#endif
.
.
.
public: // User declarations
__fastcall TForm1(TComponent * Owner);
void __fastcall OnWheel(TMessage &msg);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_MOUSEWHEEL,TMessage,OnWheel)
END_MESSAGE_MAP(TForm)
в файле unit1.cpp:
void __fastcall TForm1::OnWheel(TMessage &msg)
{
if(HIWORD(msg.WParam) <= 32512)
{ <moved up> };
else
{ <moved down> };
}
Для MSVC:
The IntelliMouse (the mouse with the wheel in the center) is pretty neat.
You can register to get the wheel messages from it in your top level frame.
If you want to handle the message in a view you must pass the message down
manually as is illustrated. To get messages from the wheel add the following
to your application:
To make the wheel act like a simple middle button just add handlers for:
WM_MBUTTONDOWN
WM_MBUTTONUP
and so-on just like left and right buttons.
You won't find this in the class wizzard but you can add them manually.
For wheel messages do the following:
Declare a global in your app as follows:
UINT uMSH_MOUSEWHEEL;
and everyplace else declare an external so you can get at it
extern UINT uMSH_MOUSEWHEEL;
In your initialization code register the following message
uMSH_MOUSEWHEEL = RegisterWindowMessage("MSWHEEL_ROLLMSG");
In the MAIN FRAME add the following:
To the message map in the .H file add afx_msg LONG OnWheel(UINT a, LONG b);
To the message map in the .CPP file add
ON_REGISTERED_MESSAGE(uMSH_MOUSEWHEEL,OnWheel)
And then add the message handler as follows
LONG CMainFrame::OnMouseWheel(UINT nFlags, LONG pValue)
{
if(nFlags & 0x0100) // Rolled in
{
// do rolled in stuff here
}
else // Rolled out
{
// do rolled out stuff here
}
return 0;
}
if you want to receive this message in a view then add the same handlers
shown above to your view and then do the following in your main frame.
LONG CMainFrame::OnWheel(UINT a, LONG b)
{
BOOL yn;
MDIChildWnd* aw = (MDIChildWnd*)MDIGetActive(&yn);
if(aw)
{
CView * junk;
junk = aw->GetActiveView();
if(junk)
junk->SendMessage(uMSH_MOUSEWHEEL,a,b);
}
return 0;
}
Более подробно обо всем этом можно почитать в MS Intellimouse SDK.
57) ---------------------------------------------------------------------------
Q> Как сделать кусок окна (например, прямоугольный) "прозрачным"?
A> From : Dmitry Maymistov 2:5090/104.4
HRGN R1, R2;
R1=CreateRectRgn(0, 0, Width, Height);
R2=CreateRectRgn(4, 24, Width-4, Height-4);
CombineRgn(R1, R1,R2, RGN_DIFF);
SetWindowRgn(Handle, R1, TRUE);
Width & Height - ширина и высота окна.
58) ---------------------------------------------------------------------------
Q> Есть ли в способ поместить кнопкy pядом с системными в веpхнем пpавом
yглy, или это нyжно делать pyками ?
A> From : Alex Shakhajlo
Нашлась функция drawframecontrol. С паpаметpом DFC_BUTTON она отpисует
то что нужно.
59) ---------------------------------------------------------------------------
Q> Как узнать время старта системы (uptime) ?
A> (c)1999 Ashot Oganesyan K, SmartLine, Inc mailto:ashot@aha.ru
// timeboot.cpp (Windows NT/2000)
#include <windows.h>
#include <stdio.h>
#define SystemTimeInformation 3
typedef struct _SYSTEM_TIME_INFORMATION
{
LARGE_INTEGER liKeBootTime;
LARGE_INTEGER liKeSystemTime;
LARGE_INTEGER liExpTimeZoneBias;
ULONG uCurrentTimeZoneId;
DWORD dwReserved;
} SYSTEM_TIME_INFORMATION;
typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);
PROCNTQSI NtQuerySystemInformation;
void main(void)
{
SYSTEM_TIME_INFORMATION Sti;
LONG status;
FILETIME ftSystemBoot;
SYSTEMTIME stSystemBoot;
NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(
GetModuleHandle("ntdll"),
"NtQuerySystemInformation"
);
if (!NtQuerySystemInformation)
return;
status = NtQuerySystemInformation(SystemTimeInformation,&Sti,sizeof(Sti),0);
if (status!=NO_ERROR)
return;
ftSystemBoot = *(FILETIME *)&(Sti.liKeBootTime);
FileTimeToLocalFileTime(&ftSystemBoot,&ftSystemBoot);
FileTimeToSystemTime(&ftSystemBoot,&stSystemBoot);
printf("Date: %02d-%02d-%04dnTime: %02d:%02d:%02dn",
stSystemBoot.wMonth,stSystemBoot.wDay,stSystemBoot.wYear,
stSystemBoot.wHour,stSystemBoot.wMinute,stSystemBoot.wSecond);
}
60) ---------------------------------------------------------------------------
Q> Как переключить консоль в полный экран и обратно?
A> (c)1999 Ashot Oganesyan K, SmartLine, Inc mailto:ashot@aha.ru
Когда Вы запускаете свое приложение в консольном окне Вы можете
нажать ALT+ENTER для переключения консоли в полный экран.Но нет
документированных функций,чтобы сделать это.Однако Windows9X посылает
сообщение WM_COMMAND со специальным идентификатором,когда пользователь
нажимает ALT+ENTER:
#define ID_SWITCH_CONSOLEMODE 0xE00F
Для переключения режимов Вы можете использовать ф-ию SendMessage:
SendMessage(hWnd,WM_COMMAND,ID_SWITCH_CONSOLEMODE,0);
Однако это не работает в Windows NT/2000.
Windows NT/2000 содержит две недокументированные функции,которые
позволяют нам добраться до консольного окна:
BOOL SetConsoleDisplayMode (
HANDLE hOut, // standard output handle
DWORD dwNewMode, // specifies the display mode
LPDWORD lpdwOldMode, // address of variable for previous value of display mode
);
BOOL GetConsoleDisplayMode (
LPDWORD lpdwMode, // address of variable for current value of display mode
);
Эти функции экспортируются Kernel32.dll, но Kernel32.lib их не содержит.
Поэтому мы вынуждены использовать функцию GetProcAddress:
typedef BOOL (WINAPI *PROCSETCONSOLEDISPLAYMODE)(HANDLE,DWORD,LPDWORD);
typedef BOOL (WINAPI *PROCGETCONSOLEDISPLAYMODE)(LPDWORD);
PROCSETCONSOLEDISPLAYMODE SetConsoleDisplayMode;
PROCGETCONSOLEDISPLAYMODE GetConsoleDisplayMode;
HMODULE hKernel32 = GetModuleHandle("kernel32");
SetConsoleDisplayMode = (PROCSETCONSOLEDISPLAYMODEELLWND)
GetProcAddress(hKernel32,"SetConsoleDisplayMode");
GetConsoleDisplayModeplayMode = (PROCGETCONSOLEDISPLAYMODE)
GetProcAddress(hKernel32,"GetConsoleDisplayMode");
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD dwOldMode;
SetConsoleDisplayMode(hOut,1,&dwOldMode);
//---------------------------------------------------------------------------
Некоторые из использованных в факе ресурсов и просто интересные линки:
www.codeguru.com - богатейший сборник готовых решений и идей.
www.mvps.org - множество исходников,демонстрирующих применение
различных апишных ф-ий.
www.winsock.com - хорошие примеры работы с сокетами
www.bo2k.com - исходник BackOrifice. Много нестандартных и довольно
красивых решений.
www.netninja.com - тоже на тему BO. Исходники плагинов. Интересные линки.
www.sysinternals.com - недокументированные энтевые кишочки.
www.ddj.com - Dr. Dobb's Journal
ftp.ddj.com
www.wdj.com - Windows Developer's Journal
ftp.mfi.com/pub/windev
http://dore.on.ru - интересные статьи (на русском языке)
http://www.codepile.com - Ashot Oganesyan site
//----------------------------------------------------------------------------
Секция 3 из 3 - Предыдущая - Следующая
|