WM_DEVICECHANGE를 보다가 나온 녀석..

도대체 정체가 멀까?


001b 27 WM_DEVMODECHANGE

0219 537 WM_DEVICECHANGE

[링크 : https://wiki.winehq.org/List_Of_Windows_Messages]


읽어 보면.. 사용자가 장치 모드를 바꾸는 거랑(즉, 사용자가 트리거.. 해상도 변경 등... 일려나?)

The WM_DEVMODECHANGE message is sent to all top-level windows whenever the user changes device-mode settings.

A window receives this message through its WindowProc function. 

[링크 : https://msdn.microsoft.com/.../dd145209(v=vs.85).aspx] WM_DEVMODECHANGE


장치 설정이 바뀌거나(뽑는건 사용자의 행위지만, 뽑음으로 장치 설정이 바뀌는건 OS의 책임이니?)

의 차이인거 같은데 누가 행위의 주체이냐? 라는 미묘한 차이가 관건으로 보인다.

Notifies an application of a change to the hardware configuration of a device or the computer.

A window receives this message through its WindowProc function. 

[링크 : https://msdn.microsoft.com/.../aa363480(v=vs.85).aspx] WM_DEVICECHANGE


ResetDC()는 WM_DEVMODECHANGE가 처리 할때 불리는데..

용지 방향을 바꿀때 쓸수도 있다. 근데 장치명 변경이나 이런데는 쓰지 말라 라는데 용도가 머냐..

The device context is updated from the information specified in the Windows DEVMODE structure. This member function only resets the attribute device context.

An application will typically use the ResetDC member function when a window processes a WM_DEVMODECHANGE message. You can also use this member function to change the paper orientation or paper bins while printing a document.

You cannot use this member function to change the driver name, device name, or output port. When the user changes the port connection or device name, you must delete the original device context and create a new device context with the new information.

Before you call this member function, you must ensure that all objects (other than stock objects) that had been selected into the device context have been selected out.

[링크 : https://msdn.microsoft.com/ko-kr/library/etschh40.aspx]

신고

'Programming > C / Win32 / MFC' 카테고리의 다른 글

정체 불명의.. 메시지 WM_DEVMODECHANGE  (0) 2017.11.13
윈도우 ini 파일 사용하기  (0) 2017.11.13
hidpi 지원 - winform wpf mfc  (0) 2017.11.10
cedit ctrl-a 단축키 사용하기  (0) 2017.11.08
mfc sleep 주의  (0) 2017.11.08
win32 usb class  (0) 2017.11.03
Posted by 구차니

댓글을 달아 주세요

한번 써봐야지..


msdn 문서를 보니 16비트 OS와의 호환성으로 놔둔거고

레지스트리 쓰세요~ 라고 되어있네?


[링크 : http://myblue0324.tistory.com/93]

[링크 : http://terrorjang.tistory.com/18]

[링크 : https://ko.wikipedia.org/wiki/INI_파일]


BOOL WINAPI WritePrivateProfileString(

  _In_ LPCTSTR lpAppName,

  _In_ LPCTSTR lpKeyName,

  _In_ LPCTSTR lpString,

  _In_ LPCTSTR lpFileName

); 

[링크 : https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms725501(v=vs.85).aspx]


DWORD WINAPI GetPrivateProfileString(

  _In_  LPCTSTR lpAppName,

  _In_  LPCTSTR lpKeyName,

  _In_  LPCTSTR lpDefault,

  _Out_ LPTSTR  lpReturnedString,

  _In_  DWORD   nSize,

  _In_  LPCTSTR lpFileName

); 

[링크 : https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms724353(v=vs.85).aspx]


+

ini 파일 존재 여부는 이걸로 하면 편할거 같고..

BOOL PathFileExists(

  _In_ LPCTSTR pszPath

); 

[링크 : https://msdn.microsoft.com/ko-kr/library/windows/desktop/bb773584(v=vs.85).aspx]


음.. Private 붙은거랑은 무슨 차이일려나?

읽어 보다 보니.. lpFileName이 없는게 차이고.. win.ini에 섹션을 만들어서 관리 하는 것으로 보이네..

일단 내 목적에는 Private..가 맞는 듯 하다.

[링크 : https://msdn.microsoft.com/en-us/library/windows/desktop/ms724366(v=vs.85).aspx] GetProfileString

[링크 : https://msdn.microsoft.com/en-us/library/windows/desktop/ms725504(v=vs.85).aspx] WriteProfileString

신고

'Programming > C / Win32 / MFC' 카테고리의 다른 글

정체 불명의.. 메시지 WM_DEVMODECHANGE  (0) 2017.11.13
윈도우 ini 파일 사용하기  (0) 2017.11.13
hidpi 지원 - winform wpf mfc  (0) 2017.11.10
cedit ctrl-a 단축키 사용하기  (0) 2017.11.08
mfc sleep 주의  (0) 2017.11.08
win32 usb class  (0) 2017.11.03
Posted by 구차니

댓글을 달아 주세요

win10 에서는 바로 적용되는 hidpi의 적용과

win7에서는 최소한 로그아웃해야 하는 녀석이긴 하지만


아무튼 win32 에서도 dpi 변경시에 이벤트가 날아 온다는 거군..

다만 win32는 vs2012 이후에 적용이 되는 것 같은데


찾다보니 win7 대응으로 vs2010 이고

win8  이후에 대응을 위해 vs2012 출시 된 거 같으니

그런 지원 기능 차이가 생기는 걸려나?


그래서 vs2008이 vista 대응이라 개판인건가!?

(찾아보니. 비스타 지원용.. 그래서 그렇게 vs2008도 망작이었던 게냐...)

[링크 : https://en.wikipedia.org/wiki/Microsoft_Visual_Studio#2008]


case WM_DPICHANGED

    // Find the button and resize it 

    HWND hWndButton = FindWindowEx(hWnd, NULL, NULL, NULL); 

    if (hWndButton != NULL) 

    { 

        UpdateButtonLayoutForDpi(hWndButton); 

    } 

}  

[링크 : https://msdn.microsoft.com/ko-kr/library/windows/desktop/dn312083(v=vs.85).aspx]


어? 지원범위로는 win7 에서는 해당 이벤트가 발생하지 않을테니..

초기 실행시 CreateWindow에서 

Minimum supported client Windows 8.1 [desktop apps only]


이 놈도.. win8 이상..

GetDpiForMonitor()

[링크 : https://msdn.microsoft.com/ko-kr/library/windows/desktop/dn280510(v=vs.85).aspx]


이 놈은 win10 이상.. -_-

GetDpiForWindow()

[링크 : https://msdn.microsoft.com/en-us/library/windows/desktop/mt748624(v=vs.85).aspx]


[링크 : https://msdn.microsoft.com/en-us/library/windows/desktop/mt843498(v=vs.85).aspx] win32

   [링크 : https://blogs.msdn.microsoft.com/vcblog/2010/03/11/mfc-applications-now-default-to-being-dpi-aware/]

[링크 : https://docs.microsoft.com/en-us/dotnet/framework/winforms/high-dpi-support-in-windows-forms] winform

[링크 : https://msdn.microsoft.com/ko-kr/library/windows/desktop/ee308410(v=vs.85).aspx] wpf


+

2017.11.13

GetDeviceCaps(hdcScreen, LOGPIXELSX);

GetDeviceCaps(hdcScreen, LOGPIXELSY); 

[링크 : https://stackoverflow.com/questions/12652835/getting-actual-screen-dpi-ppi-under-windows]


int GetDeviceCaps(

  _In_ HDC hdc,

  _In_ int nIndex

);


LOGPIXELSX

Number of pixels per logical inch along the screen width. In a system with multiple display monitors, this value is the same for all monitors.

LOGPIXELSY

Number of pixels per logical inch along the screen height. In a system with multiple display monitors, this value is the same for all monitors.


Minimum supported client

Windows 2000 Professional [desktop apps only] 

[링크 : https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd144877(v=vs.85).aspx]


음.. win7 에서는 96dpi로 기본 설정된다고 하는데

변경하면 저게 다르게 나오려나?

[링크 : https://www.techrepublic.com/.../get-a-better-view-in-windows-7-by-adjusting-dpi-scaling/]

신고

'Programming > C / Win32 / MFC' 카테고리의 다른 글

정체 불명의.. 메시지 WM_DEVMODECHANGE  (0) 2017.11.13
윈도우 ini 파일 사용하기  (0) 2017.11.13
hidpi 지원 - winform wpf mfc  (0) 2017.11.10
cedit ctrl-a 단축키 사용하기  (0) 2017.11.08
mfc sleep 주의  (0) 2017.11.08
win32 usb class  (0) 2017.11.03
Posted by 구차니

댓글을 달아 주세요

음.. 그냥.. 기본 단축키가 아니었던건가 -ㅁ-?


[링크 : http://blog.naver.com/sjplus/220436689165]

신고

'Programming > C / Win32 / MFC' 카테고리의 다른 글

윈도우 ini 파일 사용하기  (0) 2017.11.13
hidpi 지원 - winform wpf mfc  (0) 2017.11.10
cedit ctrl-a 단축키 사용하기  (0) 2017.11.08
mfc sleep 주의  (0) 2017.11.08
win32 usb class  (0) 2017.11.03
CEdit 내용 지우기와 메모리 사용량  (0) 2017.10.26
Posted by 구차니

댓글을 달아 주세요

Programming/C++ / STL2017.11.08 15:59

정작 써본건 처음이라..

아무튼 이녀석은 오른쪽 부터 기본값을 정할 수 있고

값이 없으면 기본값이 들어간다.


그런데 함수 prototype에 없는거지

함수 선언에 넣으면 아래와 같이 재정의 되었다고 배를 짼다.


error C2572: 'CtestDlg::sender' : 기본 매개 변수 재정의. 매개 변수 9

'CtestDlg::sender' 선언을 참조하십시오. 


[링크 : http://shaeod.tistory.com/365]


근데 이게.. msvc 특성인지 gcc나 다른것도 포함하는 표준인지 모르겠네...

신고

'Programming > C++ / STL' 카테고리의 다른 글

c++ 함수 인자 기본값  (0) 2017.11.08
cpp string compare 와 ==  (0) 2017.01.31
cpp this  (0) 2016.07.18
class 기본 접근제한자  (0) 2016.07.18
cpp 매크로 __PRETTY_FUNCTION__  (0) 2016.07.18
cpp dlopen / gcc -l  (0) 2016.07.12
Posted by 구차니

댓글을 달아 주세요

Sleep() 함수는 그 함수에서 멈춰버리지

메인 쓰레드 메시지를 처리하지 못하니까

시리얼 같은거 보내면서 Sleep() 하고 또 보내면

받는 쪽에서 처리를 못한채 이벤트가 쌓여서 죽어 버린다.


[링크 : http://lafirr.tistory.com/56]

[링크 : http://egloos.zum.com/sweeper/v/2942286]

신고

'Programming > C / Win32 / MFC' 카테고리의 다른 글

hidpi 지원 - winform wpf mfc  (0) 2017.11.10
cedit ctrl-a 단축키 사용하기  (0) 2017.11.08
mfc sleep 주의  (0) 2017.11.08
win32 usb class  (0) 2017.11.03
CEdit 내용 지우기와 메모리 사용량  (0) 2017.10.26
CEdit 길이 제한  (0) 2017.10.26
Posted by 구차니

댓글을 달아 주세요

GetRawInputDeviceInfo()를 통해서 받아오니..

이름이 내가 기대했던 device description이 아니라.. 식별자에 가까운 녀석이 나온다 -_-a

nResult = GetRawInputDeviceInfo(pRawInputDeviceList[i].hDevice, // Device

RIDI_DEVICENAME,                // Get Device Name

wcDeviceName,                   // Get Name!

&nBufferSize);


str.Format(_T("%s"),wcDeviceName);

\\?\HID#VID_060B&PID_6220&MI_00#7&3275dfb8&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}



[링크 : https://stackoverflow.com/questions/36453082/c-winapi-get-list-of-all-connected-usb-devices]

[링크 : https://oroboro.com/usb-serial-number/]

[링크 : https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms645597(v=vs.85).aspx]

[링크 : https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms645598(v=vs.85).aspx]



+

2017.11.05

내가 원하는 항목이 bus reported device description 인 듯?

[링크 : http://searchingforbit.blogspot.com/2014/05/winusb-communication-with-stm32-round-2.html]


        if (SetupDiGetDeviceRegistryProperty (hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC,

                                              &dwPropertyRegDataType, (BYTE*)szDesc,

                                              sizeof(szDesc),   // The size, in bytes

                                              &dwSize))

            _tprintf (TEXT("    Device Description: \"%s\"\n"), szDesc);


            if (fn_SetupDiGetDevicePropertyW (hDevInfo, &DeviceInfoData, &DEVPKEY_Device_BusReportedDeviceDesc,

                                              &ulPropertyType, (BYTE*)szBuffer, sizeof(szBuffer), &dwSize, 0))

                _tprintf (TEXT("    Bus Reported Device Description: \"%ls\"\n"), szBuffer); 


[링크 : https://stackoverflow.com/questions/3438366/setupdigetdeviceproperty-usage-example]

   [링크 : https://stackoverflow.com/.../how-to-retrieve-bus-reported-device-description-from-arriving-usb-device]


SetupDiGetDeviceProperty function

[링크 : https://msdn.microsoft.com/en-us/library/windows/hardware/ff551963(v=vs.85).aspx]

SetupDiGetDeviceRegistryProperty function

[링크 : https://msdn.microsoft.com/en-us/library/windows/hardware/ff551967(v=vs.85).aspx]

신고

'Programming > C / Win32 / MFC' 카테고리의 다른 글

cedit ctrl-a 단축키 사용하기  (0) 2017.11.08
mfc sleep 주의  (0) 2017.11.08
win32 usb class  (0) 2017.11.03
CEdit 내용 지우기와 메모리 사용량  (0) 2017.10.26
CEdit 길이 제한  (0) 2017.10.26
MFC USB 시리얼 제거 탐지하기 OnDeviceChange()  (0) 2017.10.25
Posted by 구차니

댓글을 달아 주세요

시리얼 모니터 만들었는데.. 입력 받을때 마다 메모리가 쭉쭉 늘어난다 ㅠㅠ

내용을 empty string으로 해도.. 삭제하고 undo 버퍼를 비워도 안되는데

멀 해야지.. 할당했던 메모리를 다시 뱉을까?


메모리 사용량 늘어남 -_-

m_eterm0.SetSel(0, -1);

m_eterm0.Clear();

m_eterm0.EmptyUndoBuffer();


메모리 사용량 변함없음(줄지 않음)


m_eterm0.SetWindowTextW(_T("")); 



[링크 : https://msdn.microsoft.com/ko-kr/library/f7yhsd2b.aspx]

신고

'Programming > C / Win32 / MFC' 카테고리의 다른 글

mfc sleep 주의  (0) 2017.11.08
win32 usb class  (0) 2017.11.03
CEdit 내용 지우기와 메모리 사용량  (0) 2017.10.26
CEdit 길이 제한  (0) 2017.10.26
MFC USB 시리얼 제거 탐지하기 OnDeviceChange()  (0) 2017.10.25
MFC 다이얼로그에 웹브라우저 넣기  (0) 2017.10.24
Posted by 구차니

댓글을 달아 주세요

당연(?) 하겠지만 CEdit에 넣을수 있는 글씨는 제한이 있다.

풀어는 줄 수 있는데.. 적당히 풀어야 메모리 적당히 먹겠...지?


[링크 : http://blog.naver.com/joon2457/220628611105]


CEdit::SetLimitText

void SetLimitText( UINT nMax );

Parameters

nMax

The new text limit, in bytes. 

[링크 : https://msdn.microsoft.com/en-us/library/aa279321(v=vs.60).aspx]


CEdit::LimitText

void LimitText( int nChars = 0 );

Parameters

nChars

Specifies the length (in bytes) of the text that the user can enter. If this parameter is 0, the text length is set to UINT_MAX bytes. This is the default behavior. 

[링크 : https://msdn.microsoft.com/en-us/library/aa279307(v=vs.60).aspx]

신고
Posted by 구차니

댓글을 달아 주세요

대부분의 툴들이..

USB 시리얼 뽑으면 먹통이 되는 경우가 많은데

그거 해결용으로 검색중..


[링크 : https://stackoverflow.com/.../identify-disconnect-event-with-a-windows-usb-virtual-com-port]


FTDI의 경우에는 이렇게 보내는 주는 듯?

class CAboutDlg : public CDialog

{

void CD2XXNotifyDlg::OnPaint();

BOOL CD2XXNotifyDlg::OnDeviceChange(UINT EventType, DWORD dwData);

protected:

DECLARE_MESSAGE_MAP()

};

void CAboutDlg::DoDataExchange(CDataExchange* pDX){}

BEGIN_MESSAGE_MAP(CD2XXNotifyDlg, CDialog)

ON_WM_PAINT()

ON_WM_DEVICECHANGE()

END_MESSAGE_MAP()

void CD2XXNotifyDlg::OnPaint()

{}

BOOL CD2XXNotifyDlg::OnDeviceChange(UINT EventType, DWORD dwData) {}

[링크 : http://www.ftdichip.com/.../AN_152_Detecting_USB_%20Device_Insertion_and_Removal.pdf]



MFC 클래스 위저드에는 WM_DEVICECHANGE가 없는데 afxmsg.h 에는 존재한다.

#define ON_WM_DEVICECHANGE() \

{ WM_DEVICECHANGE, 0, 0, 0, AfxSig_bwl, \

(AFX_PMSG)(AFX_PMSGW) \

(static_cast< BOOL (AFX_MSG_CALL CWnd::*)(UINT, DWORD_PTR) > ( &ThisClass :: OnDeviceChange)) }, 


    case WM_DEVICECHANGE:
    {
        //
        // This is the actual message from the interface via Windows messaging.
        // This code includes some additional decoding for this particular device type
        // and some common validation checks.
        //
        // Note that not all devices utilize these optional parameters in the same
        // way. Refer to the extended information for your particular device type 
        // specified by your GUID.
        //
        PDEV_BROADCAST_DEVICEINTERFACE b = (PDEV_BROADCAST_DEVICEINTERFACE) lParam;
        TCHAR strBuff[256];

        // Output some messages to the window.
        switch (wParam)
        {
        case DBT_DEVICEARRIVAL:
            msgCount++;
            StringCchPrintf(
                strBuff, 256, 
                TEXT("Message %d: DBT_DEVICEARRIVAL\n"), msgCount);
            break;
        case DBT_DEVICEREMOVECOMPLETE:
            msgCount++;
            StringCchPrintf(
                strBuff, 256, 
                TEXT("Message %d: DBT_DEVICEREMOVECOMPLETE\n"), msgCount);
            break;
        case DBT_DEVNODES_CHANGED:
            msgCount++;
            StringCchPrintf(
                strBuff, 256, 
                TEXT("Message %d: DBT_DEVNODES_CHANGED\n"), msgCount);
            break;
        default:
            msgCount++;
            StringCchPrintf(
                strBuff, 256, 
                TEXT("Message %d: WM_DEVICECHANGE message received, value %d unhandled.\n"), 
                msgCount, wParam);
            break;
        }
        OutputMessage(hEditWnd, wParam, (LPARAM)strBuff); 

} 

[링크 : https://msdn.microsoft.com/en-us/library/windows/desktop/aa363432(v=vs.85).aspx]


뽑으면 0x0007->0x8004 순서로 발생하고

꼽으면 0x0007->0x0007->0x8000->0x0007 으로 발생한다.

(근데 뽑는건 꼽는거에 비해서 반응이 많이 느리거나 안될때도 있음)

DBT_DEVNODES_CHANGED 0x0007

DBT_DEVICEARRIVAL 0x8000

DBT_DEVICEREMOVECOMPLETE 0x8004 

[링크 : https://msdn.microsoft.com/en-us/library/windows/desktop/aa363480(v=vs.85).aspx]


+

여긴 일단 .net 쪽

[링크 : https://stackoverflow.com/.../usb-serial-port-unplugged-but-still-in-the-list-of-ports]

[링크 : https://stackoverflow.com/.../com-port-disappears-when-unplugging-usb]

신고
Posted by 구차니

댓글을 달아 주세요