|
I am trying to create a dialog MFC application that reads the cursor position anywhere on the screen, finds the colour of the pixel at that location and reports the information back to the dialog application.
I have tried SetCapture and I must be doing something wrong because the cursor location stops reporting as soon as the cursor leaves the client area of the dialog. I have also looked at the "Screen Color Picker" by Florin Vasilescu. That uses an OnTimer function that allows me to read the screen location, but does not report mouse actions (LBUTTONDOWN) so that I can read the pixel at the cursor location.
I have also tried using SetWindowsHookEx and defining the MouseProc (as described by Vesi in the CodeGuru article "Modal dialog and outside mouse control". That wasn't successful. If I use the WH_JOURNALRECORD hook ID as described there appears to be an indeterminate delay between any mouse (or keyboard) action and interaction with screen objects. If I use the WH_MOUSE no mouse actions are detected.
Could someone help me with how to either properly set SetCapture() or point me to where I might discover how to read mouse actions outside the dialog box? I'm happy to supply code, but at this point it's a bit of a mess since I've been trying everything.
Thanks for any help you may be able to provide. Much appreciated.
|
|
|
|
|
rbrunton wrote: I am trying to create a dialog MFC application that reads the cursor position anywhere on the screen, finds the colour of the pixel at that location and reports the information back to the dialog application. This sounds like Pixie. I've used it a few times, and it does what I needed it to do.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Show me a community that obeys the Ten Commandments and I'll show you a less crowded prison system." - Anonymous
|
|
|
|
|
Thanks David,
I'll check it out as a tool, but I'm really looking to find out how to accomplish the task; essentially a programming learning experience.
|
|
|
|
|
PS - Pixie doesn't seem to address the key problem. Instead of using a left-mouse click to grab the colour at the particular location, pixie require keyboard shortcuts - Ctrl+Alt+c to copy HTML, Ctrl_Alt_X for to bring up the standard windows color dialog and Ctrl+Alt+Z to display a larger background of the color at the cursor. I would like to accomplish the selection with the left-mouse click as that seems a little more "natural" in a windows environment and then have the result in the main dialog screen of the application to manipulate it into various formats (HEX, RGB, HTML, etc.)
|
|
|
|
|
Take a look at windows hooks.
==============================
Nothing to say.
|
|
|
|
|
May be you just want to capture the mouse position, and you have no problem in finding the colour, then you can set a new Timer, then in the OnTimer function, you may try GetCursorPos() to retrieve the mouse's position.
If you want to capture other mouse's action like mouse click... then take a look at global hook, as described in this Mouse and KeyBoard Hooking utility with VC++[^]
|
|
|
|
|
I found if set TTF_TRACK flag to CTooltipCtrl, SetDelayTime doesn't work anymore, so the tooltip won't disappear automatically. I want to show the tooltip just below specified control, and expect it to disappear after a few seconds(the time can set with SetDelayTime). Anybody can help me?
Here is my steps to construct tool tip:1. Add member variable
CToolTipCtrl m_tooltip;
2. override PreTranslateMessage
BOOL CPF_GetSetNameDlg::PreTranslateMessage( MSG* pMsg )
{
switch (pMsg->message)
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_LBUTTONUP:
case WM_RBUTTONUP:
case WM_MBUTTONUP:
case WM_MOUSEMOVE:
m_tooltip.RelayEvent(pMsg);
break;
}
return CDialog::PreTranslateMessage(pMsg);
}
3. OnInitialDialog
BOOL CPF_GetSetNameDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//tooltip
EnableToolTips();
m_tooltip.Create(this , WS_POPUP | TTS_NOPREFIX | TTS_BALLOON);
m_tooltip.SetDelayTime(TTDT_INITIAL, 0);
m_tooltip.SetDelayTime(TTDT_AUTOPOP, 30000);
m_tooltip.SetDelayTime(TTDT_RESHOW, 30000);
m_tooltip.AddTool(GetDlgItem(IDC_SETNAME), _T(""));
m_tooltip.SetMaxTipWidth(600);
}
4. Control to show tool tip
if(bShow)
{
m_tooltip.UpdateTipText(_T("Hello, money!"), pWnd);
CToolInfo sTinfo;
m_tooltip.GetToolInfo(sTinfo, pWnd);
sTinfo.uFlags = TTF_TRACK;
m_tooltip.SetToolInfo(&sTinfo);
CRect rect;
pWnd->GetWindowRect(rect);
m_tooltip.SendMessage(TTM_TRACKPOSITION, 0, (LPARAM)MAKELONG(rect.left, rect.bottom));
m_tooltip.SendMessage(TTM_TRACKACTIVATE, TRUE, (LPARAM)&sTinfo );
}
|
|
|
|
|
I have this code:
if(m_Bitmap.GetSafeHandle())
m_Bitmap.DeleteObject();
HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, lpszPathName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
if(NULL == hBitmap)
{
CString sMessage;
const DWORD dwError = ::GetLastError();
sMessage.Format(_T("Failed to load '%s' file. Reason: %s\n"), lpszPathName, GetErrorString(dwError));
AfxMessageBox(sMessage, NULL, MB_ICONERROR);
return FALSE;
}
m_Bitmap.Attach(hBitmap);
and work ok, but on the big bitmaps, I get:
Not enough server storage is available to process this command
ok, I read this one[^], and I modified the "IRPStackSize" value to 0x19 (25 decimal), not working ... hoe can I get rid of this error ?
modified 12-Jun-13 4:37am.
|
|
|
|
|
Is it really that error message and not the code 8 ERROR_NOT_ENOUGH_MEMORY message 'Not enough storage is available to process this command'?
You might google for 'loadimage ERROR_NOT_ENOUGH_MEMORY'. Reading some of the results, it seems that removing the LR_CREATEDIBSECTION flag might solve the problem. If you need a DIBSECTION bitmap and loading the image as DDB succeeds, you might try the CopyImage()[^] function afterwards to convert the loaded DDB.
|
|
|
|
|
I had removed LR_CREATEDIBSECTION flag from LoadImage function, and I had the same error ...
|
|
|
|
|
How big is your image? If you read some of the Google results, you will find that others had similar problems and solved it by using other methods to load images from files (e.g. the MFC CImage class that uses Gdiplus::Bitmap ). Check also if your image is valid by loading it with any painting program. Also check that the image is not RLE compressed.
|
|
|
|
|
I confes that the problem taking place at 750 MB bitmap file ... I agree, the picture is huge, but the Windows 7 netive viewer can open this bitmap ... Though, MSPaint (Paint windows native image editor) give the same result (even get the same error message), can not open this picture as well ...
modified 12-Jun-13 6:13am.
|
|
|
|
|
That is large; probably too large. There are system and OS depending limits for bitmaps (required memory and max. width and height). While loading the bitmap, twice the memory is required when it must be converted in some way.
It seems that the picture viewer uses some other method (e.g. allocating a buffer, reading the image line by line, converting each line to the pixel format used by the video card and finally copying the content from the buffer to the video memory).
|
|
|
|
|
Ok, you are very kind ! Kindly thank you for your interest !
|
|
|
|
|
Hello Friends
I am using SetupDigetRegistryProperty to access USB Devices.
So,regarding that I was trying to access Property SPDRP_LEGACYBUSTYPE which is described like this
Quote: SPDRP_LEGACYBUSTYPE
The function retrieves the device's legacy bus type as an INTERFACE_TYPE value (defined in Wdm.h and Ntddk.h).
I tried to get this value in char ,it returns some special character. I tried to catch in DWORD,it returns some number.
DWORD DataT;
LPTSTR buffer = NULL;
DWORD buffersize = 0;
SetupDiGetDeviceRegistryProperty(
hDevInfoSet,
&DeviceInfoData,
SPDRP_LEGACYBUSTYPE,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize)
Any Ideas?
Regards
Y
|
|
|
|
|
|
Thanks jochen for your Reply.
I tried ur way but it is not the value that I was looking For.
May be you can give more Ideas. here is what I want. When I right Click on USB Device from Device manager,it open up properties Dialog where we can select property and its value. Here, I found one property "bus relation" which I am trying to get using SetupDi calls.
Bus relation value is showing like this :
USBPRINT\CANONIP4200\6&19ACF&0&USB001
This is the device Instance Id.
But when I tried to get same using SetDiGetDeviceInstanceId,it gives me like
USB\VID_04A9&PID_10A2\C34BBD
How can I get USBPRINT\CANONIP4200\6&19ACF&0&USB001 ?
Regards
Y
|
|
|
|
|
|
Thanks A Lot jochen
I followed your post and get succeed in getting Bus Relation value[Device Id] which gives me Printer name.
Thank you Very Much Again.
Regards
Y
|
|
|
|
|
Nice to hear that you solved the problem and thank you for the feedback.
|
|
|
|
|
Hi,
I working on a plugin system for a MFC C++ application. So I started with a small plugin DLL with a simple function creating an object of a class with virtual functions and returning that object to the caller. The object is created on the heap and actually a pointer to the object is returned.
In the main application a function loads the plugin (LoadLibrary), searches the exported function (GetProcAddress) and executes the function. As result the created object is available, as expected. So far so good.
Btw: the class is already declared in a different DLL linked by both the main application and the plugin DLL.
Next I want to unload the plugin with FreeLibrary.
That leads to the problem of a corrupt vftable of the created object. I found out, that the __vfptr is in the memory of the plugin DLL and so unloading the DLL destroys that memory and the __vfptr is not usable anymore.
Is there any way to change that behaviour?
with kind regards,
Joerg
|
|
|
|
|
In a word: No. If the object is created from a DLL that was dynamically loaded, then you must not unload the library until all instances of the class have been deleted.
Use the best guess
|
|
|
|
|
If you unload the DLL then you remove all code from memory that represents the implementation of class methods including the actual vtable that points to these methods. Another important thing: the code that deletes the object should be in the DLL (same is true for object creation, normally you create an instance by calling an exported dll method)! One good solution to that is putting a Release() method into your class and Release() could simply do the "delete this;" stuff. Delete all class instances before unloading the DLL.
|
|
|
|
|
You could create a static function in the dll where the class is defined. This function would create the object inside the dll with parameters from the plugin. It returns the pointer to the plugin who passes it to the application. This way the object should be defined entirely in the dll so that you can unload the plugin.
However you should consider, whether it is really necessary to use the plugin unter these circumstances i.e. when the application knows the actual type of the returned object.
|
|
|
|
|
Creating webbrowser as below
hret=CoCreateInstance(clsid,NULL,CLSCTX_ALL,IID_IUnknown
,reinterpret_cast<void**>(&m_pUnknown));
hret=m_pUnknown->QueryInterface(IID_IWebBrowser2,(PVOID *)&m_pBrowser);
ASSERT(SUCCEEDED(hret));
but when i say
HRESULT hret = m_pBrowser->Navigate2(varURL,&noArg,&noArg,&noArg,&noArg);
its opening new IE window on WIn7. But in Xp sys its not happening like that. I dont want to open new IE window
Any one has any idea why it is opening on new IE window on Win7
|
|
|
|