faqs.org.ru

 Главная > Программирование > Программирование в 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" - Обсудить эту статью на Форуме
Главная - Поиск по сайту - О проекте - Форум - Обратная связь

© faqs.org.ru