Главная > Программирование > Программирование в Windows > |
Win32 API FAQ |
Секция 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%02X\n", (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%02x\n", 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 off\n:try\ndel "); strcat(batlines,modulename); strcat(batlines,"\nif exist "); strcat(batlines,modulename); strcat(batlines," goto try\n"); 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] != '\0' ) { /* 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 HostNameOrIPAddress\n"); return; } // Dynamically load the ICMP.DLL hndlIcmp = LoadLibrary("ICMP.DLL"); if (hndlIcmp == NULL) { fprintf(stderr,"\nCould not load ICMP.DLL\n"); 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 address\n"); FreeLibrary(hndlIcmp); return; } // Init WinSock nRet = WSAStartup(0x0101, &wsaData ); if (nRet) { fprintf(stderr,"\nWSAStartup() error: %d\n", nRet); WSACleanup(); FreeLibrary(hndlIcmp); return; } // Check WinSock version if (0x0101 != wsaData.wVersion) { fprintf(stderr,"\nWinSock version 1.1 not supported\n"); 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 found\n", 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 = SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards \"netcard# " "netcard# " номер сетевой карты (обычно 1) 3. Берем значение "ServiceName" 4. Ищем subKey = SYSTEM\CurrentControlSet\Services\"ServiceName" \Parameters\TcpIp" 5. Устанавливаем "IpAddress" для смены IP адреса 6. Устанавливаем "SubnetMask" для смены subnet mask 7. Устанавливаем "DefaultGateway" для смены default gateway 8. Перегружаемся. Q> Как программно поменять HostName? 1. Открываем HKEY_LOCAL_MACHINE 2. Ищем subKey = SYSTEM\CurrentControlSet\Services\TcpIp\Parameters 3. Устанавливаем значение "HostName" 4. Ищем subKey = SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName 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 test\n"); 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 Ok\n"); break; default:printf ("Error\n");; } } 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-%04d\nTime: %02d:%02d:%02d\n", 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 - Предыдущая - Следующая
Вернуться в раздел "Программирование в Windows" - Обсудить эту статью на Форуме |
Главная - Поиск по сайту - О проекте - Форум - Обратная связь |