c调用java
http://blog.youkuaiyun.com/normalnotebook/archive/2006/05/19/744927.aspx
freetype2
http://blog.youkuaiyun.com/vrix/archive/2008/09/03/2874334.aspx
http://blog.youkuaiyun.com/fengrx/archive/2009/06/30/4310274.aspx
多显卡多显示器扩展桌面(转 csdn ryan_332595319)
一台机器
系统windows7
显卡4块
每块显卡两个输出(VGA和DVI)
最多可以同时接入8个显示器
现在机器连接了N(1<= N <=8)台显示器 PS:每台显示器支持的最大分辨率未知
但是系统桌面只在一台显示器上显示(即主显示器)
现在要写个函数实现将桌面扩展到所有已经连接好的显示器上
扩展顺序是按照系统识别的显示器编号依次扩展
每台显示器的分辨率为最佳分辨率(或最大分辨率)
相关代码如下
void ExtrendMonitor()
{
DWORD DispNum = 0;
DISPLAY_DEVICE DisplayDevice;
DEVMODE DeviceMode;
ZeroMemory(&DisplayDevice, sizeof(DisplayDevice));
DisplayDevice.cb = sizeof(DisplayDevice);
while(EnumDisplayDevices(NULL, DispNum, &DisplayDevice, 0))
{
ZeroMemory(&DeviceMode, sizeof(DEVMODE));
DeviceMode.dmSize = sizeof(DEVMODE);
EnumDisplaySettings((LPCTSTR)DisplayDevice.DeviceName, ENUM_REGISTRY_SETTINGS, &DeviceMode);
//这里获得的DeviceMode值来自哪里?注册表?那注册表的值又来自哪里?
ChangeDisplaySettingsEx((LPCTSTR)DisplayDevice.DeviceName, &DeviceMode, NULL, CDS_GLOBAL | CDS_NORESET | CDS_UPDATEREGISTRY, NULL);
ZeroMemory(&DisplayDevice, sizeof(DisplayDevice));
DisplayDevice.cb = sizeof(DisplayDevice);
DispNum++;
}//while循环退出时为什么DispNum == 11?不是应该等于8吗?
ChangeDisplaySettingsEx(NULL, NULL, NULL, 0, NULL);
}
我的finalskb程序修改
将SoftKeyWinProc函数修改为如下,效果会更好,整个程序中只用一个SoftKeyWinProc函数
int SoftKeyWinProc(void *pobj, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
EMPTY_WINDOW_SAVE *pobjSave;
ClaSoftKey *pWin;
int iMid;
HDC hDC;
PAINTSTRUCT objPS;
HWND hParent;
POINT objPoint;
RECT objWinRect;
CKeyBoard *pKeyBoard;
TRACKMOUSEEVENT objTrackEvent;
pobjSave = (EMPTY_WINDOW_SAVE*)pobj;
pWin = (ClaSoftKey*)pobjSave->object_pointer;
if(0 == pWin)
{
return -1;
}
hParent = ::GetParent(hWnd);
iMid = -1;
switch(message)
{
case WM_LBUTTONDOWN:
{
if(0 == (pWin->m_iFlag & MOUSE_DOWN))
{
::GetCursorPos(&objPoint);
::ScreenToClient(hWnd, &objPoint);
pWin->m_iXMouse = objPoint.x;
pWin->m_iYMouse = objPoint.y;
::SetCapture(hWnd);
pWin->m_iFlag |= MOUSE_DOWN;
if(0 == (SHIFT_MODULE & pWin->m_iFlag))
{
pKeyBoard = (CKeyBoard*)pWin->m_pObject;
pKeyBoard->KeyOperate(pWin->m_iKeyValue, 2);
}
}
if(pWin->m_iIsEnable)
{
pWin->FlushWindow();
}
}
break;
case WM_LBUTTONUP:
{
if(pWin->m_iFlag & MOUSE_DOWN)
{
pWin->m_iXMouse = 0;
pWin->m_iYMouse = 0;
::ReleaseCapture();
pWin->m_iFlag &= (~MOUSE_DOWN);
pKeyBoard = (CKeyBoard*)pWin->m_pObject;
if(SHIFT_MODULE & pWin->m_iFlag)
{
if(pWin->m_iFlag & SHIFT_DOWN)
{
pWin->m_iFlag &= (~SHIFT_DOWN);
if(pKeyBoard != 0)
{
pKeyBoard->KeyOperate(pWin->m_iKeyValue, 1);
}
}
else
{
pWin->m_iFlag |= SHIFT_DOWN;
if(pKeyBoard != 0)
{
pKeyBoard->KeyOperate(pWin->m_iKeyValue, 2);
}
}
}
else
{
if(pKeyBoard != 0)
{
pKeyBoard->KeyOperate(pWin->m_iKeyValue, 1);
}
}
}
if(pWin->m_iIsEnable)
{
pWin->FlushWindow();
}
}
break;
case WM_MOUSEMOVE:
{
::GetWindowRect(hWnd, &objWinRect);
::GetCursorPos(&objPoint);
if(pWin->m_iFlag & MOUSE_MOVE)
{
::MoveWindow(hWnd, objPoint.x - pWin->m_iXMouse, objPoint.y - pWin->m_iYMouse, /
objWinRect.right - objWinRect.left, /
objWinRect.bottom - objWinRect.top, 1);
}
else
{
::ScreenToClient(hWnd, &objPoint);
if((objPoint.x < 0) || (objPoint.y < 0) /
|| (objPoint.x >= objWinRect.right - objWinRect.left) /
|| (objPoint.y >= objWinRect.bottom - objWinRect.top))
{
if(pWin->m_iFlag & MOUSE_MOVEING)
{
pWin->m_iFlag &= (~MOUSE_MOVEING);
pWin->FlushWindow();
}
}
else
{
if(0 == (pWin->m_iFlag & MOUSE_MOVEING))
{
pWin->m_iFlag |= MOUSE_MOVEING;
pWin->FlushWindow();
objTrackEvent.cbSize = sizeof(objTrackEvent);
objTrackEvent.dwFlags = TME_LEAVE;
objTrackEvent.hwndTrack = hWnd;
::TrackMouseEvent(&objTrackEvent);
}
}
}
}
break;
case WM_MOUSELEAVE:
{
if(0 == (pWin->m_iFlag & MOUSE_DOWN))
{
pWin->m_iFlag &= (~MOUSE_MOVEING);
pWin->FlushWindow();
}
}
break;
case WM_PAINT:
{
hDC = BeginPaint(hWnd, &objPS);
iMid = pWin->OnDraw(hDC);
EndPaint(hWnd, &objPS);
}
break;
case WM_CLOSE:
{
::DestroyWindow(hWnd);
}
break;
case WM_DESTROY:
{
pWin->m_hSelfWin = 0;
if(CLOSE_EXIT & pWin->m_iFlag)
{
::PostQuitMessage(0);
}
pWin->Destroy();
iMid = 0;
}
break;
case WM_KEYUP:
{
if((VK_ESCAPE == (unsigned int)wParam) && (ESC_CLOSE & pWin->m_iFlag))
{
::DestroyWindow(hWnd);
iMid = 0;
}
}
break;
};
return iMid;
}