15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту

Visual C++ / FAQ Part 2

Как сграбить экран?
1. Клавиша Alt+Print Screen (не забывайте, что эффект распространяется только на текущее окно)
2. С помощью MFC это делается командами GetDC(GetDesktopWindow), затем BitBlt куда надо. RTFM: BitBlt, CreateCompatibleDC, CreateCompatibleBitmap:


     hDc = GetDC(hWndScr);
     hMemDc = CreateCompatibleDC(hDc);
     hBmpNew = CreateCompatibleBitmap(hDc, 500, 500);
     hBmpOld = SelectObject(hMemDc, hBmpNew);
     BitBlt(hMemDc, 0, 0, 500, 500, hDc, 0, 0, SRCCOPY);
        Как сделать надпись перевернутую на 90 градусов?
Все как обычно, только в структуре LOGFONT установить        (только TrueType шрифты):
lfOrientation = lfEscapement =900 - угол, в        десятых долях град.
Кстати, Escapement приводит в повороту строки на 90        градусов, а Orientation - каждой буквы.
lfClipPrecision =        CLIP_LH_ANGLES; - не забудьте установить этот флаг (под NT можно без него,        а под 95/98 - никак) 

        Как, например, сетевую карту "отключить в данной конфигурации" через        Win32 API?
Мой        компьютеp->Свойства->Устpойства->NetCard->Отключено в данной        конфигypации можно сделать программно: 
Если в Win95        DiChangeState(lpdi, DICS_DISABLE, DICS_FLAG_CONFIGSPECIFIC); - только        yчтите, что setupx.dll 16-битовая 
Если в 98 или nt SetupDiChangeState        

        Как сделать так, чтобы _ресурсы_ dll были видны в пользующей его        программе? 

HGLOBAL LoadResource(
    HMODULE  hModule, // хэндл модуля, откуда гpузишь pесуpс
    HRSRC  hResInfo  // идентификатоp pесуpса.
                                     );

То есть для того, чтобы загpузить pесуpсы из DLL, тебе надо загpузить DLL, а полученный хэндл использовать в LoadRecource

Как запустить текущего e-mail клиента?


::ShellExecute(NULL,NULL,"mailto:any@mail.ru?subject=how",NULL,NULL,SW_SHOWNORMAL);

        Как сделать, чтобы некотоpое пpиложение не показывалось в Task Bar,        System Tray и в списке по Ctrl+Alt+Del? 

/*apphider.cpp*/
/* Alexey Chubar & Paul Ishenin*/
#pragma hdrstop
#include <condefs.h>
#include <windows.h>
#include <tlhelp32.h>
#include <string.h>
#include <stdlib.h>
USELIB("KERNEL32.lib");
#pragma argsused
extern "C" __stdcall DWORD RegisterServiceProcess(DWORD dwProcessID, DWORD
dwType);
char * ExtractFilePath(const char *Name)
{
 int i = strlen(Name), l = strlen(Name);
 char *res="\0";
 while ((i > 0)&&(Name[i] != '\\')) i--;
 if (i)
 {
   res = (char *)malloc(l - i);
   strcpy(res, Name + i + 1);
   res[l-i-1] = '\0';
 }
 return res;
}
void HideApp(DWORD dwProcessID)
{
 HWND MyHandle = GetTopWindow(0);
 DWORD WindowProcess;
 while (MyHandle != NULL)
 {
   if ((GetWindowThreadProcessId(MyHandle, &WindowProcess) != 0) &&
(WindowProcess == dwProcessID))
   {
    ShowWindow(MyHandle, SW_HIDE);
   }
   MyHandle = GetNextWindow(MyHandle, GW_HWNDNEXT);
 }
 RegisterServiceProcess(dwProcessID, 1);
}
DWORD __fastcall FindID(const char *FName)
{
 HANDLE h;
 PROCESSENTRY32 p;
 h=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 p.dwSize=sizeof(p);
 if(!Process32First(h,&p))
  return -1;
 if(strcmp(strlwr((char *)FName), strlwr(ExtractFilePath(p.szExeFile)))==0)
 {
    CloseHandle(h);
    return p.th32ProcessID;
  }
 while(Process32Next(h,&p))
  if(strcmp(strlwr((char *)FName), strlwr(ExtractFilePath(p.szExeFile)))==0)
  {
    CloseHandle(h);
    return p.th32ProcessID;
   }
  CloseHandle(h);
  return -1;
}
int main(int argc, char* argv[])
{
  if (argc > 1)
  {
   DWORD ProgID=FindID(argv[1]);
   if(ProgID != (DWORD)-1)
    HideApp(ProgID);
   }
   return 0;
}

или


  _asm{
   mov eax,1
   push eax
   dec eax
   push eax
   call dword ptr[pRegisterServiceProcess]
  }

А теперь более подробно. Невидимость по Alt-Tab:


 var  WnHnd   : Integer;
 WnHnd := GetWindowLong(Application.Handle, GWL_EXSTYLE);
 WnHnd := WnHnd or WS_EX_TOOLWINDOW; {Типа Tools-окно}
 SetWindowLong(Application.Handle, GWL_EXSTYLE, WnHnd);

Невидимость в Панели Задач:


 ShowWindow[Async](Application.Handle,SW_HIDE)
        Как я могy закpыть пpиложение, запyщенное по ShellExecute?
Как любое другое: получить HWND его окна; по этому HWND        получить ID процесса и TerminateProcess() & WM_CLOSE для окна.        

        Как программно переключить раскладку клавиатуры?
Используйте функцию ActivateKeyboardLayout (...), которая        позволяет установить язык для текущего потока. 

А вот пример на Visual C++ который показывает как использовать эту функцию (прислал Осадчий Константин):

*****************************************************************************************************

// NewWordDlg.cpp : implementation file
#include "stdafx.h"
#include "Diction.h"
#include "DictionSet.h"
#include "NewWordDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CNewWordDlg dialog

CNewWordDlg::CNewWordDlg(CDictionSet* prs,CWnd* pParent /*=NULL*/)	: CDialog(CNewWordDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CNewWordDlg)
	m_strRus = _T("");
	m_strAngl = _T("");
	//}}AFX_DATA_INIT
	m_pSet = prs;
}

void CNewWordDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CNewWordDlg)
	DDX_Control(pDX, IDCANCEL, m_ctrlCancel);
	DDX_Control(pDX, IDOK,     m_ctrlOk);
	DDX_Text(pDX, IDC_RUS,     m_strRus);
	DDX_Text(pDX, IDC_ANGL,    m_strAngl);
	//}}AFX_DATA_MAP
	DDX_Text(pDX, IDC_RUS,  m_pSet->m_RusWord);
	DDX_Text(pDX, IDC_ANGL, m_pSet->m_AnglWord);
}

BEGIN_MESSAGE_MAP(CNewWordDlg, CDialog)
	//{{AFX_MSG_MAP(CNewWordDlg)
	ON_EN_SETFOCUS(IDC_ANGL, OnSetfocusAngl)
	ON_EN_SETFOCUS(IDC_RUS, OnSetfocusRus)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
// CNewWordDlg message handlers
BOOL CNewWordDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	lstrcpy(m_szLangOld, _T("\0"));
	GetKeyboardLayoutName(m_szLangOld);
	return TRUE;
}


void CNewWordDlg::OnSetfocusAngl() 
{
	DWORD dwLang = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
	CString strMl; strMl.Format(_T("00000%x"), dwLang);
	WORD mlwLang = LOWORD(dwLang);
	dwLang = MAKELONG(mlwLang, mlwLang);
	CString strLang; strLang.Format(_T("%x"), dwLang);
	TCHAR szLang[10];
	lstrcpy(szLang, _T("\0"));
	GetKeyboardLayoutName(szLang);
	if(strMl != szLang) {
		lstrcpy(szLang, strLang);
		ActivateKeyboardLayout(LoadKeyboardLayout(szLang, KLF_ACTIVATE | KLF_REPLACELANG), KLF_REORDER);
	}
}	

//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
void CNewWordDlg::OnSetfocusRus() 
{	
	DWORD dwLang = MAKELANGID(LANG_RUSSIAN, SUBLANG_DEFAULT);
	CString strMl; strMl.Format(_T("00000%x"), dwLang);
	WORD mlwLang = LOWORD(dwLang);
	dwLang = MAKELONG(mlwLang, mlwLang);
	CString strLang; strLang.Format(_T("%x"), dwLang);
	TCHAR szLang[10]; 
	lstrcpy(szLang, _T("\0"));
	GetKeyboardLayoutName(szLang);
	if(strMl != szLang) {
		lstrcpy(szLang, strLang);
		ActivateKeyboardLayout(LoadKeyboardLayout(szLang, KLF_ACTIVATE | KLF_REPLACELANG), KLF_REORDER);
	}
}

void CNewWordDlg::OnOK() 
{
	DWORD dwLang = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
	WORD mlwLang = LOWORD(dwLang);
	dwLang = MAKELONG(mlwLang, mlwLang);
	CString strLang; strLang.Format(_T("%x"), dwLang);
	TCHAR szLang[10];
	lstrcpy(szLang, _T("\0"));
	GetKeyboardLayoutName(szLang);
	CString str = m_szLangOld;
	if(str != szLang) {
		lstrcpy(szLang, strLang);
		ActivateKeyboardLayout(LoadKeyboardLayout(szLang, KLF_ACTIVATE | KLF_REPLACELANG), KLF_REORDER);
	}
	CDialog::OnOK();
}

void CNewWordDlg::OnCancel() 
{
	DWORD dwLang = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
	WORD mlwLang = LOWORD(dwLang);
	dwLang = MAKELONG(mlwLang, mlwLang);
	CString strLang; strLang.Format(_T("%x"), dwLang);
	TCHAR szLang[10];
	lstrcpy(szLang, _T("\0"));
	GetKeyboardLayoutName(szLang);
	CString str = m_szLangOld;
	if(str != szLang) {
		lstrcpy(szLang, strLang);
		ActivateKeyboardLayout(LoadKeyboardLayout(szLang, KLF_ACTIVATE | KLF_REPLACELANG), KLF_REORDER);
	}
	CDialog::OnCancel();
}



*****************************************************************************************************

        Как программно сделать eject для CD-ROM'a, ZIP'a? 

BOOL EjectDrive95(char *path)
{
 HANDLE hDevice;
 DWORD dw;
 BOOL fResult;
 DIOC_REGISTERS reg;

 hDevice = CreateFile("\\\\.\\vwin32", 0, 0, NULL, 0,
FILE_FLAG_DELETE_ON_CLOSE, NULL);
 if (hDevice == INVALID_HANDLE_VALUE)
  return FALSE;
  reg.reg_EAX = 0x440D;
  reg.reg_EBX = toupper(path[0]) - 'A' + 1;
  reg.reg_ECX = 0x0849;
 fResult = DeviceIoControl(hDevice,
     VWIN32_DIOC_DOS_IOCTL,®, sizeof(reg),
     ®, sizeof(reg), &dw, 0);
 CloseHandle(hDevice);
 return fResult;
}

BOOL EjectDriveNT(char *path)
{
  HANDLE hDisk;
  DWORD dwRc;
  TCHAR tsz[8];
  SECURITY_ATTRIBUTES sa;

  wsprintf(tsz, TEXT("\\\\.\\%c:"), TEXT('@') + toupper(path[0]) - 'A' + 1);
  sa.nLength = sizeof(sa);
  sa.lpSecurityDescriptor = NULL;
  sa.bInheritHandle = TRUE;
  hDisk =  CreateFile(tsz, GENERIC_READ | GENERIC_WRITE,
    FILE_SHARE_READ | FILE_SHARE_WRITE,&sa,
    OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, NULL);
  if (hDisk != INVALID_HANDLE_VALUE)
  {
  FlushFileBuffers(hDisk);
    return DeviceIoControl(hDisk, IOCTL_DISK_EJECT_MEDIA, NULL, 0, NULL, 0,&dwRc, NULL);
  }
  return FALSE;
}

        Как убрать часы из SystemTray? 
На время их        можно убрать с помщью следующего кода: 

  hClockWnd=FindWindowEx(FindWindowEx(FindWindowEx(NULL,NULL,"Shell_TrayWnd",NULL),
            NULL,"TrayNotifyWnd",NULL),NULL,"TrayClockWClass",NULL);
  if(hClockWnd!=NULL)
    ShowWindow(hClockWnd,SW_HIDE);